8

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

...?

4

2 回答 2

6

如果您每秒调用 Math.random()十亿次,您应该预计每 150 年左右就会遇到此错误。而且我对 Javascript的性能给予太多的评价。:-)

于 2013-05-26T03:01:13.627 回答
2

不。比起“正确性”和奇怪的边缘情况,更倾向于清晰和简单。这个更复杂的代码可能会让一些糟糕的开发人员(或者可能是未来的你)维护这个代码。发生这种情况的机会大于 Math.random() 无法按预期工作的 2^62 分之一的机会。

于 2013-05-26T02:55:34.713 回答