在使用`Math.random()`时,我应该考虑获得排除上限的1 ^ 2 ^ 62的可能性吗?

时间:2013-05-26 00:57:45

标签: javascript random

来自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;

...

2 个答案:

答案 0 :(得分:6)

如果您每秒调用Math.random()十亿次,您应该会每150年左右遇到此错误。我正在给Javascript 方式过多的表现。 : - )

答案 1 :(得分:2)

没有。支持清晰度和简洁性而不是“正确性”和奇怪的边缘情况。这个更复杂的代码可能会绊倒一些可怜的开发人员(或者未来你)维护这段代码。这可能性大于Math.random()无法按预期工作的1 ^ 2 ^ 62的机会。