今天在写程序的时候,需要产生一系列的随机数,于是我写了与下面类似的代码:
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秒钟吧。