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

Same random numbers every loop iteration

本文关键字:随机数 循环 迭代      更新时间:2023-10-16

我有一个运行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"answers"2"会发生变化,但在这15次中仍然相同。

既然循环运行了15次不同的时间,carSetterdecider不应该在每次迭代中打印出不同的随机数吗?

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

当您调用srand(x)时,x的值决定了在随后对rand()的调用中返回的伪随机数序列,完全取决于x的值

当你处于循环中并调用顶部的srand()时:

while (...) {
    srand(time(0));
    x = rand();
    y = rand();
}

则根据CCD_ 19返回的值生成相同的随机数序列。由于计算机速度很快,循环可能在不到一秒钟的时间内运行,time(0)每次通过循环都会返回相同的值。因此CCD_ 21和CCD_。

相反,您通常只需要在程序开始时调用srand()一次

srand(time(0));
while (...) {
    x = rand();
    y = rand();
}

在上述情况下,xy在循环中每次都将具有不同的值。

每次调用srand(time(0))时,都在为伪随机数生成器播种,为其注入一个新的伪随机数序列。序列是不同的,这取决于srand的参数是什么,在这种情况下,您使用time(0),因此,假设您每秒最多调用一次程序,您总是会得到一个新的序列。当你拨打rand()时,你只会得到这个序列中的下一个号码。

然而,由于您决定在程序中多次调用srand,并且程序速度很快(即time(0)不会更改),因此您所要做的只是重复将PRNG重置为相同的序列。这就是为什么你总是得到相同的值——你不断地为PRNG重新设定种子,使其成为相同的序列,这也会将光标移动到序列的开头。

播种一次。一次

正如Kerrek所说,播种只在程序开始时进行一次。一次之后,可以随意多次拨打兰德。

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

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