我有一个运行15次的for循环,每次迭代都有dh.setDoors()。
setDoors所做的是调用srand(time(0)),然后每当需要一个随机数时,它都会使用,例如,carSetter = rand()%3+1。或者,它可以使用decider = rand()%2+1。
现在,通常decider和carSetter以不同的方式使用,但我怀疑有问题,并让它在每次迭代时输出carSetter和decider。结果是这样的:
Door 1 has car
Decider is 2
Door 1 has car
Decider is 2
Door 1 has car
Decider is 2
Door 1 has car
Decider is 2
Door 1 has car
Decider is 2
etc...当我多次运行它时,值“1”和“2”会发生变化,但在15次运行过程中始终保持不变。
既然循环运行了15次,那么carSetter和decider不应该在每次迭代中打印出不同的随机数吗?
当我没有srand(time(0))时,它会像预期的那样工作,但没有种子集,所以每次都是相同的“随机”数字序列,所以可能是种子有问题?
发布于 2012-02-13 01:57:53
当您调用srand(x)时,x的值决定了在随后的rand()调用中返回的伪随机数序列,这完全取决于x的值。
当您在循环中并在顶部调用srand()时:
while (...) {
srand(time(0));
x = rand();
y = rand();
}然后,根据time(0)返回的值生成相同的随机数序列。由于计算机运行速度很快,而您的循环运行时间可能不到一秒,因此time(0)每次循环都会返回相同的值。因此,x和y在每次迭代中都是相同的。
相反,您通常只需要在程序开始时调用srand()一次:
srand(time(0));
while (...) {
x = rand();
y = rand();
}在上面的例子中,x和y在每次循环中都会有不同的值。
发布于 2012-02-13 01:58:14
每次调用srand(time(0))时,您都在播种伪随机数生成器,向其注入一个新的伪随机数序列。序列是不同的,这取决于srand的参数是什么,在本例中,您使用time(0),因此,假设您每秒最多调用程序一次,您将始终获得一个新序列。当您调用rand()时,您只需获取此序列中的下一个数字。
但是,由于您已经决定在程序中多次调用srand,而且您的程序速度很快(即time(0)没有变化),所以您所要做的就是重复地将PRNG重置为相同的顺序。这就是为什么你总是得到相同的值-你不断地将PRNG重新设定为相同的序列,这也会将光标移动到序列的开头。
种子一次。一次。
发布于 2012-02-13 01:55:00
您需要在程序开始时运行srand,例如在main-function中。
当您在使用rand()的函数的顶部运行srand(time(0))时,您很可能每次都会给它提供相同的种子。time(0)以秒为单位提供时间,因此您需要避免在同一秒内调用setDoors两次,以便每次都获得不同的数字。如果您在同一秒内调用setDoors两次,则随机种子将是相同的,并且后续对rand()的调用将生成相同的伪随机数序列。
https://stackoverflow.com/questions/9251117
复制相似问题