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

Aba*_*oub 0 c++ random

可能重复:
如何在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);
}
Run Code Online (Sandbox Code Playgroud)

输出将始终是一系列重复的数字,如2222222211111111.如何让它产生八个随机数?

tem*_*def 6

您的代码存在问题:

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

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

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

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

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