相同的序列我有以下的方法,其产生随机数:兰特()总是返回上应用程序重新启动
int random_number() //Random number generator
{
int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000
return x;
}
给此方法的呼叫在一个循环中它迭代五次使用。这种方法的问题在于,它几次运行该程序时似乎总是生成相同的数字。这怎么解决?
相同的序列我有以下的方法,其产生随机数:兰特()总是返回上应用程序重新启动
int random_number() //Random number generator
{
int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000
return x;
}
给此方法的呼叫在一个循环中它迭代五次使用。这种方法的问题在于,它几次运行该程序时似乎总是生成相同的数字。这怎么解决?
您需要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;
}
femtoRgon是正确的。这将播种计划,但看看在新的C++标准,因为他们已经改善随机数生成 看到
兰特是不是一个真正的随机数,而是一个伪随机一个,仅仅“如果您不知道用于生成值的算法,则看起来是“随机的”。从手册页:
的rand()函数返回值的范围为0〜RAND_MAX包容
伪随机意味着给定相同的输入的伪随机整数,称为种子,它会给出相同的输出。当您尝试调试问题时,这实际上非常有用,因为将返回相同的“随机”值,让您重现问题。 如果你真的需要随机性,这很糟糕。
如上所述,通过在每次运行中将种子改变为不同的东西,比如自从epoch以来的秒数,您可以从调用rand()获得不同的值。
srand(time(NULL))
如果您尝试调试,您可能需要打印出种子,以便在发生问题时可以重现问题。
['srand()'](http://www.cplusplus.com/reference/clibrary/cstdlib/srand/)可能派上用场。但是,如果发现1000000明显大于[RAND_MAX](http://www.cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/)的大多数实现定义,则可能会郁闷地采用该模数。 – WhozCraig