关于srand()和rand()产生随机数的一点问题

来源:互联网 发布:linux # $ 编辑:程序博客网 时间:2024/06/06 04:24
今天在写程序的时候,需要产生一系列的随机数,于是我写了与下面类似的代码:
 for(int i = 0; i < 100; i++){        srand(time(NULL));        cout << rand()%1000 << endl;    }

运行以后发现,产生的随机数都是相同的:


真是百思不得其解。幸好有google+baidu+sogou.

原来,在c/c++中采用srand()和rand()产生的随机数其实严格意义上来说应该叫做伪随机数。伪随机数并不是说这些数不是随机的,而是指这些数具有一定的规律。假如每次通过srand()种下的种子都是同样的,那每次产生的随机数列也应该是一样的。所以我们应该把种子设为一个变化的数,比如说流逝的时间,可以这样:srand(time(NULL))。如此一来,随着程序对种子进行赋值的时间的不同,种子time(NULL)自然也就不同了。不过,由于我是在一个for循环中对种子进行赋值的。而for循环每循环一次的时间是非常短的,远远低于一秒(注:time()返回的是秒数),也就是说for循环循环一次的时间不足以使time(NULL)发生改变。既然srand()的种子是相同的,那么rand()产生的随机数序列也就是相同的了。而每次我们输出的都是这些序列中的第一个数,所以肯定就是相同的了。验证程序:
int flag = 0;    for(int i=0;;i++){         srand((unsigned int)time(NULL));        int j = rand()%1000;        if(j != flag)        {            flag = j;            cout<<i<<"      "<<j<<endl;        }
结果:


结果说明,for循环要循环10的7次方次,才会产生不同的随机数。这应该耗费的是1秒钟吧。



0 0
原创粉丝点击