为什么rand()在这个for循环中使用srand(time(null))返回相同的值?

时间:2012-05-17 22:56:58

标签: c++

我有以下代码

#include<iostream>
#include "time.h"

using namespace std;

void printRandomNumber()
{
    srand(time(NULL));
    cout << rand() % 3;
}

int main()
{
    for(int i=0; i<=5; i++)
    {
        printRandomNumber();
    }
system("pause");
}

输出是重复六次的相同数字,我希望打印出数字组合。

5 个答案:

答案 0 :(得分:17)

因为每次都播种相同的值 - time只有二级精度,我非常确定你的计算机可以在一秒钟内处理这六个循环迭代。 ; - ]

在程序开始时

种子一次

答案 1 :(得分:3)

因为肯定你每次都会给同一个种子喂食相同的种子,因为你的循环需要不到1秒的时间。

srand函数只应在程序的生命周期内调用一次。

答案 2 :(得分:3)

您应该在开头使用srand一次。每个可能的种子对应于一组特定的伪随机数,当使用该种子时,它们总是相同的。因为你的基础是秒,你没有给它时间改变。因此,您每次都会得到同一组数字的第一个数字。

答案 3 :(得分:1)

这是因为你的随机种子本质上是相同的。你有2个解决方案:

  • 您可以将srand(time(0))放在代码的开头。这将为每个循环生成更好的随机序列。

  • 如果您希望将srand(time(0))置于main()之外,则可以在功能中将srand(time(0))替换为srand(rand())。这将生成随机随机种子,从而产生更好的情况。

答案 4 :(得分:0)

这适用于您的案例

    #include<iostream>
    #include "time.h"

    using namespace std;

    // Reset the random number generator with the system clock.
    void seed()
   {
       srand(time(0));
   }

    void printRandomNumber()
    {        
        cout << rand() % 3;
    }

    int main()
    {
        seed();
        for(int i=0; i<=5; i++)
        {
            printRandomNumber();
        }
    system("pause");
    }