如何解决Math.random可以产生的最大值是多少?
在使用Math.random
的javascript时,我遇到了一个有趣的问题。
根据docs,它会产生一个“伪随机数,范围为0到小于1”,但是它能产生的最大数字是小于1?
我做了这个愚蠢的代码,试图获得最高价值
maxIteration = 1000000000
value = 0
count = 0
while(value < 1 && count++ < maxIteration) {
let newValue = Math.random()
value = value < newValue ? newValue : value
}
console.log('value',value)
console.log('count',count)
我能得到的最高价是0.9999999989486876
,但这是最高价吗?
解决方法
Math.random
可以产生的最大值是多少?
文档无法说明您指向的Mozilla文档和ECMAScript Language Specification(在撰写本文时为2020版)。
Number
类型可以表示的小于1的最大值是1-2 -53 。 (当有效数的所有53位均为1且指数为-1时,会出现此值,从而使值+ 1.111…111 2 •2 -1 = 1-2 −53 。)理想情况下,这将是Math.random
返回的最大值,但文档中并未这么说。
您可以检查docs for numbers来了解浮点细节。
TLDR:数字类型是双精度64位二进制格式IEEE 754值。数字仅保留约17个小数位精度;算术取整。
var minValue = Number.MIN_VALUE; // 5e-324
// (1 - minValue) == 1
var maxRandom = 1 - 10e-17; // ~= as 1 - (2e-53)
document.body.innerHTML = 'Number.MIN_VALUE = '+ minValue + '<br>maxRandom = ' + maxRandom;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。