每次循环迭代都有相同的随机数

时间:2012-02-12 17:51:23

标签: c++ random for-loop

我有一个运行15次的for循环,每次迭代都会dh.setDoors()

setDoors所做的是致电srand(time(0)),然后只要需要随机数,就会使用carSetter = rand()%3+1。或者,它可以使用decider = rand()%2+1

现在,decidercarSetter通常以不同的方式使用,但我怀疑是一个问题,并在每次迭代时打印出carSetterdecider。这是出来的结果:

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次,每次迭代不应该carSetterdecider打印出不同的随机数吗?

当我没有srand(time(0))时,它按预期工作,但没有种子集,所以每次都是相同的“随机”数字序列,所以它可能是种子问题?

4 个答案:

答案 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)

像克雷克说的那样,在节目开始时播种只进行一次。在一个srand之后,你可以多次调用rand。

答案 3 :(得分:1)

您需要在程序开头运行srand,例如在main - 函数中运行。

当您在使用srand(time(0))的函数顶部运行rand()时,您很可能每次都给它相同的种子。 time(0)以秒为单位给出时间,因此您需要避免在同一秒内调用setDoors两次,以便每次都能获得不同的数字。如果你在同一秒内调用setDoors两次,则随机种子将是相同的,随后对rand()的调用将生成相同的伪随机数序列。