【问题标题】:Javascript - Math.random in a for loopJavascript - for 循环中的 Math.random
【发布时间】:2017-05-03 13:31:22
【问题描述】:

在 for 循环的条件下(这就是所谓的?)尝试生成随机数时,在 Javascript 中遇到了一些有趣的事情。

所以,如果我要这样写代码:

for (var i = 0; i < 20; i++) {
    var count = 0;
    for (var j = 0; j < Math.floor(Math.random() * 20); j++) {
        count++;
    }
    console.log(count);
}

它会返回如下结果:

9
5
8
3
3
2
6
8
4
4
5
6
3
3
5
3
4
5
3
11

但如果我要在第二个 for 循环之前在变量中生成一个随机数:

for (var i = 0; i < 20; i++) {
    var count = 0;
    var loopEnd = Math.floor(Math.random() * 20 + 1);
    for (var j = 0; j < loopEnd; j++) {
        count++;
    }
    console.log(count);
}

它会返回如下结果:

11
13
14
2
19
19
17
19
2
18
5
15
18
2
1
19
16
15
13
20

这里到底发生了什么?这让我困惑了一会儿。 for 循环中的 Math.random() 是否在每次迭代后生成一个新的随机数?循环是否运行代码、迭代并检查条件,并在每次检查条件时生成一个新的随机数?这是正在发生的事情吗,这就是为什么控制台中的数字小于我在 for 循环之前在变量中使用 Math.random() 的原因吗?

【问题讨论】:

  • j &lt; Math.floor(Math.random() * 20) 每次迭代都会运行,并且每次都有不同的随机值......所以,当然你会更快得到false 结果
  • 是的,循环终止条件(包括它进行的任何函数调用)在每次迭代之前都会重新评估。

标签: javascript for-loop random


【解决方案1】:

在第一个例子的内循环中:

...
for (var j = 0; j < Math.floor(Math.random() * 20); j++) {
    count++;
}
...

循环的每次迭代都会评估终止条件j &lt; Math.floor(Math.random() * 20),因此终止值会随着对Math.random()的调用而改变,从而使循环更有可能提前终止。

【讨论】:

  • 哇。我多年来一直在使用 JavaScript,最近遇到了这个问题。好消息!
【解决方案2】:

至于每次迭代都重新选择随机数时,循环平均提前终止:

如果不进行适当的统计分析,请考虑以下简单的思路:

您进行十次或更多次迭代的可能性有多大?

如果你只抽取一个介于 1 和 20 之间的随机数,那么大约 50% 的时间你会得到 10 个或更多。

如果你得到十个随机数,你需要让它们中的每一个都高于前 1,然后是 2,然后是 3,依此类推,并且几率会降低:95% * 90% * 85% * ... * 50 %。

【讨论】:

  • 这是一个很好的观点。从统计的角度来看它很有趣。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2011-10-27
  • 2011-03-13
  • 2018-03-09
  • 1970-01-01
  • 2015-02-25
  • 2015-09-18
相关资源
最近更新 更多