我有一个运行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))
时,它按预期工作,但没有种子集,所以每次都是相同的“随机”数字序列,所以它可能是种子问题?
答案 0 :(得分:12)
当您致电srand(x)
时,x
的值会确定以下对rand()
,的调用中返回的伪随机数序列,完全取决于{的值{1}}
当你处于循环中并在顶部拨打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
每次循环都会有不同的值。
答案 1 :(得分:3)
每次调用srand(time(0))
时,您都会播种伪随机数生成器,并使用新的伪随机数字序列进行插入。序列不同,取决于srand
的参数是什么,在这种情况下,您使用time(0)
因此,假设您每秒最多调用一次程序,您将始终获得一个新序列。当您拨打rand()
时,您只需按此顺序获取下一个号码。
但是,由于您决定在程序中多次调用srand
,并且因为您的程序速度很快(即time(0)
没有变化),您所做的只是重复重置PRNG到同一序列。这就是为什么你总是得到相同的值 - 你继续将PRNG重新定位为相同的序列,这也将光标移动到序列的开头。
播种一次。一旦强>
答案 2 :(得分:2)
答案 3 :(得分:1)
您需要在程序开头运行srand
,例如在main
- 函数中运行。
当您在使用srand(time(0))
的函数顶部运行rand()
时,您很可能每次都给它相同的种子。 time(0)
以秒为单位给出时间,因此您需要避免在同一秒内调用setDoors
两次,以便每次都能获得不同的数字。如果你做在同一秒内调用setDoors
两次,则随机种子将是相同的,随后对rand()
的调用将生成相同的伪随机数序列。