首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >每次循环迭代都有相同的随机数

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

Stack Overflow用户
提问于 2012-02-13 01:51:23
回答 4查看 17.2K关注 0票数 6

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

setDoors所做的是调用srand(time(0)),然后每当需要一个随机数时,它都会使用,例如,carSetter = rand()%3+1。或者,它可以使用decider = rand()%2+1

现在,通常decidercarSetter以不同的方式使用,但我怀疑有问题,并让它在每次迭代时输出carSetterdecider。结果是这样的:

代码语言:javascript
运行
复制
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))时,它会像预期的那样工作,但没有种子集,所以每次都是相同的“随机”数字序列,所以可能是种子有问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-13 01:57:53

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

当您在循环中并在顶部调用srand()时:

代码语言:javascript
运行
复制
while (...) {
    srand(time(0));
    x = rand();
    y = rand();
}

然后,根据time(0)返回的值生成相同的随机数序列。由于计算机运行速度很快,而您的循环运行时间可能不到一秒,因此time(0)每次循环都会返回相同的值。因此,xy在每次迭代中都是相同的。

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

代码语言:javascript
运行
复制
srand(time(0));

while (...) {
    x = rand();
    y = rand();
}

在上面的例子中,xy在每次循环中都会有不同的值。

票数 12
EN

Stack Overflow用户

发布于 2012-02-13 01:58:14

每次调用srand(time(0))时,您都在播种伪随机数生成器,向其注入一个新的伪随机数序列。序列是不同的,这取决于srand的参数是什么,在本例中,您使用time(0),因此,假设您每秒最多调用程序一次,您将始终获得一个新序列。当您调用rand()时,您只需获取此序列中的下一个数字。

但是,由于您已经决定在程序中多次调用srand,而且您的程序速度很快(即time(0)没有变化),所以您所要做的就是重复地将PRNG重置为相同的顺序。这就是为什么你总是得到相同的值-你不断地将PRNG重新设定为相同的序列,这也会将光标移动到序列的开头。

种子一次。一次。

票数 3
EN

Stack Overflow用户

发布于 2012-02-13 01:55:00

您需要在程序开始时运行srand,例如在main-function中。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9251117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档