【问题标题】:Why is this code to generate random numbers always producing the same numbers? [duplicate]为什么生成随机数的代码总是产生相同的数字? [复制]
【发布时间】:2011-06-25 22:29:53
【问题描述】:

可能重复:
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。如何让它产生八个随机数?

【问题讨论】:

  • 这个问题已经被问了一百万次了。完全重复。

标签: c++ random


【解决方案1】:

你的代码有问题:

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);
}

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

【讨论】:

    【解决方案2】:

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

    您的循环运行得如此之快,以至于每次循环的时间都不会改变,并且您不断将随机数生成器重置为相同的起点。

    答案:使用srandONCE,并且只使用一次,outside循环。

    【讨论】:

      【解决方案3】:

      在循环的每次迭代中使用相同的值退出重新播种。只需在main 中进行操作即可。

      【讨论】:

        猜你喜欢
        • 2019-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多