来自MDN(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/random):
Math.random
返回
[0, 1)
范围内的浮点伪随机数 也就是说,从0(含)到最高但不包括1(不包括), 然后你可以缩放到你想要的范围。
然而,它说:
请注意,JavaScript中的数字是IEEE 754浮点数 具有舍入到最接近偶数的行为,这些范围不包括一个
Math.random()
本身,并不精确,取决于界限 在非常罕见的情况下(大约在2 ^ 62中为1),它是可能的 计算通常排除的上限。
我应该考虑这些案件吗?例如,使用......
Math.min(max, Math.floor(Math.random() * (max - min + 1)) + min);
......而不是......
Math.floor(Math.random() * (max - min + 1)) + min;
...
答案 0 :(得分:6)
如果您每秒调用Math.random()十亿次,您应该会每150年左右遇到此错误。我正在给Javascript 方式过多的表现。 : - )
答案 1 :(得分:2)
没有。支持清晰度和简洁性而不是“正确性”和奇怪的边缘情况。这个更复杂的代码可能会绊倒一些可怜的开发人员(或者未来你)维护这段代码。这可能性大于Math.random()无法按预期工作的1 ^ 2 ^ 62的机会。