Javascript - for循环中的Math.random

时间:2016-12-18 08:25:44

标签: javascript for-loop random

在尝试在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()的原因?

2 个答案:

答案 0 :(得分:4)

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

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

终止条件j < Math.floor(Math.random() * 20)在循环的每次迭代中被评估,因此终止值正在通过调用Math.random()来改变每次迭代,使得循环更有可能更早地终止。

答案 1 :(得分:2)

至于在每次迭代时重新选择随机数时平均先前终止的循环:

没有进行适当的统计分析,请考虑这个简单的思路:

您有多大可能获得十次或更多次迭代?

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

如果你得到10个随机数,你需要让它们分别高于第1个,然后是2个,然后是3个,依此类推,并且几率降低:95%* 90%* 85%* ...... * 50 %。