8

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

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

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

4

4 回答 4

16

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

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;
}
于 2012-11-07T16:52:00.820 回答
5

srand(time(NULL));在您的程序启动时进行调用。

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

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

于 2012-11-07T16:51:17.997 回答
1

femtoRgon 是对的。这将为程序提供种子,但请查看新的 c++ 标准,因为它们改进了随机数生成,请参见

C++0x 中的随机数

于 2012-11-07T16:52:38.840 回答
1

rand 并不是真正的随机数,而是一个伪随机数,如果您不知道用于生成值的算法,它只会“看起来”随机。从手册页:

rand() 函数返回 0 到 RAND_MAX 范围内的伪随机整数

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

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

srand(time(NULL))

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

于 2012-11-07T16:55:27.040 回答