我知道srand()与rand()产生的是伪随机数,但是我不明白srand(int seed)的参数seed有什么用。msdn上说的是随机数的起始点,那也就是产生的随机数的最小值了,可我用dev c++简单的试了一下,产生的随机数有的比seed还小。困惑ing,那位高手给解释一下!感激ing另外,如果要产生真正的随机数,应该用那个函数。谢谢!

解决方案 »

  1.   

    难道就没有办法产生真正的随机数???另外我又试了一下,ssrand(0xfffe);第一次调用rand()返回的不是0xffff阿(msdos下16位), seed是不是与产生的伪随机数大小没有关系,只与伪随机数的序列有关阿(同一个seed对应的伪随机数序列是相同的。这一点我已经验证)?
      

  2.   

    这里涉及到伪随机数的概念,什么是伪随机数呢?伪随机数是使用一些称为种子(seed)的初始值通过某种算法得到的。这个算法是确定的,因此产生的数字序列在统计上并不是随机的。不过,假如这个算法优良,那么结果得到的数字序列就能够通过许多合理的随机性测试。这些数字通常被称为伪随机数(psreudorandom number)。除非你知道算法和种子,否则就不大能推测出这个序列[1]。  好了,下面来看一下这句话是什么意思:
    srand(time(NULL));     
    先看srand()函数有什么作用。它是用来设定种子(seed)的,例:srand(n),则n就是你设定的种子。如果每次设定的种子相同,比如srand(1),那么相当于不调用srand()函数(注意 :如果不显式调用srand()函数,系统只会默认调用一次srand(1)函数,即在第一个rand()函数之前调用;执行第2个第3个……rand()之前不会再调用srand(1)),那么接下来你再调用rand(),得到的随机数序列是相同的,这里给一个例子:windows 32 console #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>void main( void )
    {
       int i;   /* Seed the random-number generator with current time so that
        * the numbers will be different every time we run.
        */
       //srand( (unsigned)time( NULL ) );   /* Display 10 numbers. */
       for( i = 0;   i < 10;i++ )
          printf( "  %6d\n", rand() );
    }注意,这个程序中,我把srand( (unsigned)time( NULL ) )给注释起来了,所以每次运行该程序时,种子是默认给出的,都是同一个值,(vc++中默认种子的值为1),既然种子一样,就像我前面提到的,算法是一定的,所以每次产生的随机数序列都是相同的。在我的电脑上每次运行程序都产生这10个数:41 18467633426500191691572411478293582696224464所以说这些数是伪随机数。因为真正的随机数每次产生时都不应该相同,包括这个序列也不应该相同。所以说我们要产生真正的随机数,就应当在每次调用rand()之前设定不同的种子,怎样做到这一点呢?使用time(NULL)。time(NULL)返回的是一个time_t类型的数据,实际上是一个无符号整型(unsigned int)的数据,在这个32位的无符号数中,高16位存放当前Date(年月日)的信息,低16位存当前放Time(时分秒)的信息。时间是在不断变化的,所以每次调用time(NULL)返回的值是不同的(当然两次调用的时间间隔大于等于1秒才行,因为time_t中的信息只精确到秒)
    这样srand(time(NULL));    就可以保证每次都会设定新的 种子,从而再调用rand()时会得到不同的随机数序列:再给个例子[2]这个例子仅仅是把前面的例子多加了一句srand(time(NULL));    )windows 32 console #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>void main( void )
    {
       int i;   /* Seed the random-number generator with current time so that
        * the numbers will be different every time we run.
        */
       srand(time(NULL));       /* Display 10 numbers. */
       for( i = 0;   i < 10;i++ )
          printf( "  %6d\n", rand() );
    }这样每次运行程序都会得到10个不同的数,并且每次得到的这10个数都是不同的(注意理解我的意思,每次产生的10个数组成的序列不同)。注意time(NULL)的作用其实就是将当前时间保存到一个UNIT中返回,time_t osBinaryTime=time(NULL);相当于以下代码:CTime   t=CTime::GetCurrentTime();time_t   osBinaryTime=t.GetTime();参考文献: [1]数据与计算机通信第7版P218.[美]William Stallings 著.电子工业出版社[2]MSDN中srand()函数示例.