每次运行程序时都有相同的随机数

时间:2011-10-13 00:20:32

标签: c++ random

我的随机数字输出,每次运行游戏时以相同的顺序输出。为什么会这样?

我有

#include <cstdlib> 

并使用它来生成随机数

randomDiceRollComputer = 1 + rand() % 6;

4 个答案:

答案 0 :(得分:30)

您需要为随机数生成器播种:

尝试将其放在程序的开头:

srand ( time(NULL) );

请注意,您需要#include <ctime>

这里的想法是每次启动程序时为RNG添加不同的编号。通过使用时间作为种子,每次启动程序时都会得到不同的数字。

答案 1 :(得分:8)

您需要为随机数生成器提供种子。这可以通过获取当前时间来完成,因为这可能是某种随机的。

#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    int  r;
    srand(time(0));
    r = rand();
    return 0;
} 

答案 2 :(得分:3)

当用给定种子播种时(通过调用rand()),特别需要srand()函数来产生相同的数字序列;每个可能的种子值指定一个序列。如果您从未致电srand(),则会在致电srand(1)之前致电rand(),获得与此相同的序列。

(这不适用于不同的C或C ++实现。)

这对于测试目的非常有用。例如,如果您的程序中存在错误,您可以通过使用相同的种子重新运行它来重现它,保证(除了其他不可预测的行为)您将获得相同的伪随机数序列。

调用srand(time(NULL))是获得或多或少不可预测的伪随机数的常用方法。但它并不完美。如果你的程序在同一秒内运行两次,你可能会得到相同的序列,因为time()(通常)的分辨率为1秒。典型的`rand()实现足以用于加密使用;攻击者很容易猜到你将获得的数字。

还有许多其他随机数实现。 Linux系统有两个伪设备/dev/random/dev/urandom,您可以从中读取相当高质量的伪随机字节值。某些系统可能具有random()drand48()等功能。并且有许多算法;我听说过有关Mersenne Twister的好消息。

对于类似游戏的内容,你不期望或不关心那些试图作弊的玩家,srand(time(NULL))rand()可能就足够了。为了更严肃的目的,你应该从比我更了解这些东西的人那里得到建议。

comp.lang.c FAQ的第13节有一些关于伪随机数生成的非常好的信息。

答案 3 :(得分:1)

伪随机数生成器采用起始编号或种子,然后从中生成序列中的下一个编号。这就是为什么它们被称为伪随机,因为如果它们总是使用相同的起始值,它们将生成与C标准lib生成器相同的数字序列。这可以通过为生成器提供一个起始值来修复,该值将在下次运行程序时更改,如当前时间。

无论如何,你正在寻找的代码就像其他人所说的那样:

srand(time(0)); //Seed the generator, give it a starting value