rand()总是在应用程序重启时返回相同的序列

时间:2012-11-07 16:49:59

标签: c++ random numbers integer

我有以下生成随机数的方法:

int random_number() //Random number generator
{
    int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000
    return x;
}

对此方法的调用用于循环,该循环迭代五次。这种方法的问题在于,在运行程序多次时似乎总是生成相同的数字。怎么解决这个问题?

4 个答案:

答案 0 :(得分:17)

您需要seed随机数生成器,例如:

srand ( time(NULL) );
int x = rand() % 1000000 + 1;

对伪随机数生成器进行播种基本上决定了它将迭代的随机数集。使用时间是获得充分随机结果的标准方法。

编辑:

澄清一下,你应该只播种一次并获得许多随机数,如下所示:

srand ( time(NULL) );
loop {
    int x = rand() % 1000000 + 1;
}

而不是像:

loop {
    //Particularly bad if this line is hit multiple times in one second
    srand ( time(NULL) ); 
    int x = rand() % 1000000 + 1;
}

答案 1 :(得分:5)

在您的计划启动时拨打srand(time(NULL));

srand为rand函数设置种子。给它time(NULL)的返回值有助于在每个程序运行中获得不同的种子。

当您将问题标记为c ++时,您可以使用c ++ 11功能来处理random数字生成。

答案 2 :(得分:1)

femtoRgon是对的。这将使程序播种,但是看看新的c ++标准,因为它们已经改进了随机数生成 见

Random numbers in C++0x

答案 3 :(得分:1)

rand实际上不是一个随机数,而是一个伪随机数,只是"看起来"如果您不知道用于生成值的算法,则随机。从手册页:

  

rand()函数返回0到RAND_MAX(含)的伪随机整数

伪随机意味着给定相同的输入,称为种子,它将给出相同的输出。当您尝试调试问题时,这实际上非常有用,因为相同的"随机"将返回值,让您重现问题。 如果你真的需要随机性,这很糟糕。

如上所述,通过在每次运行中将种子更改为不同的内容,例如自纪元以来的秒数,您可以从调用rand()获得不同的值。

srand(time(NULL))

如果您正在尝试调试,则可能需要打印种子,以便在出现问题时重现问题。