我的随机数字输出,每次运行游戏时以相同的顺序输出。为什么会这样?
我有
#include <cstdlib>
并使用它来生成随机数
randomDiceRollComputer = 1 + rand() % 6;
答案 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