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