C++ 每次我运行程序时都是相同的随机数

C++ 每次我运行程序时都是相同的随机数,c++,random,C++,Random,我的随机数输出,每次我运行游戏时都以相同的顺序输出。为什么会这样 我有 #include <cstdlib> 您需要为随机数生成器设定种子: 请尝试将此内容放在程序的开头: srand ( time(NULL) ); 请注意,您需要#包括 这里的想法是在每次启动程序时为RNG添加不同的编号。通过使用时间作为种子,每次启动程序时都会得到不同的数字。您需要为随机数生成器提供一个种子。这可以通过获取当前时间来完成,因为这可能是某种随机的 #include <cstdlib>

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

我有

#include <cstdlib> 

您需要为随机数生成器设定种子:

请尝试将此内容放在程序的开头:

srand ( time(NULL) );
请注意,您需要
#包括


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

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

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

int main()
{
    int  r;
    srand(time(0));
    r = rand();
    return 0;
} 
#包括
#包括
使用名称空间std;
int main()
{
INTR;
srand(时间(0));
r=rand();
返回0;
} 

伪随机数生成器获取一个起始数字或种子,然后根据该数字生成序列中的下一个数字。这就是为什么它们被称为伪随机,因为如果它们总是使用相同的起始值,它们将生成与C标准库生成器相同的数字序列。这可以通过为生成器提供一个启动值来解决,该值将在下一次程序像当前时间一样运行时改变

不管怎样,正如其他人所说,您正在寻找的代码是:

srand(time(0)); //Seed the generator, give it a starting value
当使用给定种子(通过调用
srand()
)进行播种时,特别需要使用
rand()
函数来生成相同的数字序列;每个可能的种子值指定一个序列。如果您从未调用过
srand()
,那么在调用
rand()
之前调用
srand(1)
会得到相同的顺序

(这不适用于不同的C或C++实现)。 这对于测试目的很有用。例如,如果您的程序中有bug,您可以通过使用相同的种子重新运行它来复制它,从而保证(除非其他不可预测的行为)您将获得相同的伪随机数序列

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

还有许多其他的随机数实现。Linux系统有两个伪设备,
/dev/random
/dev/uradom
,您可以从中读取相当高质量的伪随机字节值。有些系统可能具有诸如
random()
drand48()
等功能。有很多算法;我听说过这家公司的好消息

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


第13节提供了一些关于伪随机数生成的非常好的信息。

基本上,RNG不是真正的随机数。他们使用一个公式来生成看似(伪)的随机数。因此,他们需要一个“起点”来开始生成序列。如果不进行种子设定,它将使用相同的默认种子并每次生成相同的序列。为了获得更好的结果,请在
srand
之后调用
rand
一次,并丢弃返回值。事实证明,相似的种子会生成相似的第一个值,但它会迅速发散。但请注意,在大多数实现中,
time(NULL)
会在一秒钟内运行程序两次时给出相同的值。这可能是问题,也可能不是问题,取决于应用程序。@KeithThompson:正确。当我遇到问题时,我会使用
rdtsc
。但这是另一个故事…@神秘:如果你的需求足够严重以至于
srand(time(NULL))
不够好,那么
rand()
可能不够好。不,它们被称为伪随机,因为它们在数学意义上不是真正的随机,只是一个近似值。每次运行时生成不同数字的PRNG仍然是伪随机的。@KeithThompson我知道,我的意思是这就是为什么这种特定类型的PRNG是PRNG。更一般地说,PRNG被称为伪随机,因为它使用确定性算法来查找序列的每个值,对吗?
srand(time(0)); //Seed the generator, give it a starting value