javascript 数学随机数的精度()

ergxz8rk  于 2023-01-24  发布在  Java
关注(0)|答案(4)|浏览(99)

JavaScript的Math.random()函数的精度是多少?

iyr7buue

iyr7buue1#

Math.random()生成大于或等于零且小于1的16位小数的浮点数。

e1xvtsh3

e1xvtsh32#

这取决于浏览器/JavaScript引擎。
最大可能的精度是52位,因为Math.random返回的是一个介于0(含)和1(不含)之间的双精度浮点数,这个最大值大约对应于16位小数,见Sly 1024的答案。
实际上,很多浏览器给予的精度都比较小,这似乎是目前的状态:

运行下面的代码几次,你会发现后面的21位在Chrome和Safari中都是0。
console.log((Math.random() * Math.pow(2,53)).toString(2));

ufj5ltwl

ufj5ltwl3#

根据维基百科:Double-precision floating-point format小数部分是52位,我们知道这个数在0和1之间(我认为不包括1),所以指数是-1,剩下52个随机位。
52个随机位为您提供52位精度,以10为基数约为

52*log10(2) ~= 15.653559774527022151114422525674 digits.
58wvjzkj

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位真精度。

相关问题