4

我有以下代码

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

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

4

5 回答 5

19

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

播种一次,在程序开始时。

于 2012-05-17T22:58:35.160 回答
3

因为当然,您通常每次都在为 srand 喂食相同的种子,因为您的循环将花费不到 1 秒的时间。

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

于 2012-05-17T22:58:42.697 回答
3

您应该srand在开始时使用一次。每个可能的种子对应于一组特定的伪随机数,当使用该种子时,这些伪随机数总是相同的。由于您要以秒为基础,因此您没有给它时间进行更改。因此,您每次都会获得同一组数字中的第一个数字。

于 2012-05-17T22:59:28.343 回答
1

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

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

  • 如果你想在srand(time(0))main() 之外,你可以在你的函数中srand(time(0))替换。srand(rand())这将生成一个随机随机种子,从而产生更好的情况。

于 2017-09-27T23:43:56.977 回答
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");
    }
于 2012-05-19T11:05:19.333 回答