JavaScript的Math.random()函数的精度是多少?
Math.random()
iyr7buue1#
Math.random()生成大于或等于零且小于1的16位小数的浮点数。
e1xvtsh32#
这取决于浏览器/JavaScript引擎。最大可能的精度是52位,因为Math.random返回的是一个介于0(含)和1(不含)之间的双精度浮点数,这个最大值大约对应于16位小数,见Sly 1024的答案。实际上,很多浏览器给予的精度都比较小,这似乎是目前的状态:
Math.random
运行下面的代码几次,你会发现后面的21位在Chrome和Safari中都是0。console.log((Math.random() * Math.pow(2,53)).toString(2));
console.log((Math.random() * Math.pow(2,53)).toString(2));
ufj5ltwl3#
根据维基百科:Double-precision floating-point format小数部分是52位,我们知道这个数在0和1之间(我认为不包括1),所以指数是-1,剩下52个随机位。52个随机位为您提供52位精度,以10为基数约为
52*log10(2) ~= 15.653559774527022151114422525674 digits.
58wvjzkj4#
Javascript中的Math.random()以原生javascript格式返回0..1范围内的浮点数,该格式为64位IEEE 754双精度浮点格式。由于此格式使用52位作为实际精度,因此在现代Javascript实现中实际上只能使用52位精度。在真实的使用中(以10为基数),这通常大致转换为15-16位数。但是,如果数字以零结尾,小数位数也可以更少。如果您使用的是非常古老的Javascript实现(Internet Explorer、2016年的Safari或2015年的Chrome或一些过时的Node旧版本),Math.random()可能使用的算法只有32位精度,这意味着最后20位精度将为0,这意味着您将获得明显更低的精度。如果您想要更高的精度,可以使用Crypto.getRandomValues(new BigUint64Array(1)),它将使用经过验证的CSPRNG算法给予64位真精度。
0..1
Crypto.getRandomValues(new BigUint64Array(1))
4条答案
按热度按时间iyr7buue1#
Math.random()
生成大于或等于零且小于1的16位小数的浮点数。e1xvtsh32#
这取决于浏览器/JavaScript引擎。
最大可能的精度是52位,因为
Math.random
返回的是一个介于0(含)和1(不含)之间的双精度浮点数,这个最大值大约对应于16位小数,见Sly 1024的答案。实际上,很多浏览器给予的精度都比较小,这似乎是目前的状态:
运行下面的代码几次,你会发现后面的21位在Chrome和Safari中都是0。
console.log((Math.random() * Math.pow(2,53)).toString(2));
ufj5ltwl3#
根据维基百科:Double-precision floating-point format小数部分是52位,我们知道这个数在0和1之间(我认为不包括1),所以指数是-1,剩下52个随机位。
52个随机位为您提供52位精度,以10为基数约为
58wvjzkj4#
Javascript中的
Math.random()
以原生javascript格式返回0..1
范围内的浮点数,该格式为64位IEEE 754双精度浮点格式。由于此格式使用52位作为实际精度,因此在现代Javascript实现中实际上只能使用52位精度。在真实的使用中(以10为基数),这通常大致转换为15-16位数。但是,如果数字以零结尾,小数位数也可以更少。
如果您使用的是非常古老的Javascript实现(Internet Explorer、2016年的Safari或2015年的Chrome或一些过时的Node旧版本),Math.random()可能使用的算法只有32位精度,这意味着最后20位精度将为0,这意味着您将获得明显更低的精度。
如果您想要更高的精度,可以使用
Crypto.getRandomValues(new BigUint64Array(1))
,它将使用经过验证的CSPRNG算法给予64位真精度。