每次循环迭代都有相同的随机数
Same random numbers every loop iteration
我有一个运行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"answers"2"会发生变化,但在这15次中仍然相同。
既然循环运行了15次不同的时间,carSetter
和decider
不应该在每次迭代中打印出不同的随机数吗?
当我没有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();
}
在上述情况下,x
和y
在循环中每次都将具有不同的值。
每次调用srand(time(0))
时,都在为伪随机数生成器播种,为其注入一个新的伪随机数序列。序列是不同的,这取决于srand
的参数是什么,在这种情况下,您使用time(0)
,因此,假设您每秒最多调用一次程序,您总是会得到一个新的序列。当你拨打rand()
时,你只会得到这个序列中的下一个号码。
然而,由于您决定在程序中多次调用srand
,并且程序速度很快(即time(0)
不会更改),因此您所要做的只是重复将PRNG重置为相同的序列。这就是为什么你总是得到相同的值——你不断地为PRNG重新设定种子,使其成为相同的序列,这也会将光标移动到序列的开头。
播种一次。一次
正如Kerrek所说,播种只在程序开始时进行一次。一次之后,可以随意多次拨打兰德。
您需要在程序的开头运行srand
,例如在main
-函数中。
当您在使用rand()
的函数顶部运行srand(time(0))
时,您可能每次都会给它相同的种子。time(0)
以秒为单位给出时间,因此您需要避免在同一秒内拨打setDoors
两次,以便每次获得不同的号码。如果在同一秒内两次调用setDoors
,则随机种子将相同,随后对rand()
的调用将生成相同的伪随机数序列。
- 程序在尝试猜测它选择的随机数时进入无限循环?
- C++ - 如何保持半随机数组在循环中排序
- C ++初学者使用while循环生成随机数
- 在C++中创建随机数矩阵,无需循环
- 在 loop_C++ 中生成随机数,并在循环中生成数组 (OpenMP)
- C++生成多个随机数而不循环
- 而循环.出现随机数
- 本应生成 2 个介于 1 和 9 之间的随机数的程序C++只生成 6 和 9 并且没有正确循环
- 用循环生成随机数
- 简单循环不适用于随机数
- 当被要求使用随机数生成器时,C++程序在while循环中崩溃
- C++循环中调用伪随机数生成器函数 - 常量种子问题
- C++循环的随机数生成器
- 将随机数插入到数组中,其中每个值都是通过 for 循环输入的
- file.get()在循环C++后返回随机数
- 每次循环迭代都有相同的随机数
- 生成均匀分布的随机数(在循环中获得相同的数字)
- 为什么我在循环中使用随机数时得到相同的结果
- 使用for循环和rand生成100个随机数,并打印出最小和最大的数字
- 我能让我的while循环在每次循环时创建一个新的随机数吗