为什么这段代码生成的随机数总是产生相同的数字?

时间:2011-02-12 01:52:26

标签: c++ random

  

可能重复:
  how to generate different random number in a loop in C++?

在此代码中:

int Randtest(int len)
{
    int test[100]={};
    for(int i=0;i<len;i++)
    {
        srand ( time(NULL) );
        cout <<(test[i]=rand()%10);
    }
}

int main()
{
 Randtest(8);
}

输出将始终是重复数字的序列,例如2222222211111111。如何让它产生8个随机数?

3 个答案:

答案 0 :(得分:6)

您的代码存在问题:

for(int i=0;i<len;i++)
{
    srand ( time(NULL) );
    cout <<(test[i]=rand()%10);
}

问题在于,在循环的每次迭代中,您将使用当前系统时间重新定位随机数发生器,通常以第二精度测量。每次向随机数发生器提供种子时,它都会重置随机值的序列,因此如果你一直在为随机发生器重复播放相同的值,那么每次重新调整时只调用rand一次它,你会一遍又一遍地回到相同的随机数序列。由于系统时间每秒只改变一次,因此会重复产生相同的数字序列。

要解决此问题,请将调用移至srand,如下所示:

srand ( time(NULL) );
for(int i=0;i<len;i++)
{
    cout <<(test[i]=rand()%10);
}

这样,您只需对随机数发生器播种一次,因此您的序列看起来应该更加伪随机。您可能仍然会看到一些重复值,但这可能是由于偶然而非随机数生成器确定性地起作用。

答案 1 :(得分:2)

srand在当前时间启动随机数生成器,由time(NULL)给出。

你的循环运行得如此之快,以至于每次通过循环都没有改变时间,你继续将随机数生成器重置为相同的起点。

答案:使用srand ONCE ,只需使用一次, 之外循环。

答案 2 :(得分:0)

在循环的每次迭代中以相同的值退出重新播种。只需在main中完成。