JavaScript的Math.random()
函数的精度是什么?
JavaScript的Math.random()
函数的精度是什么?
Math.random()
生成一个浮点数,保留16位小数,大于或等于零且小于1。
这与浏览器/JavaScript引擎有关。
最大可能精度为52位,因为Math.random
返回一个双精度浮点数,介于0(含)和1(不含)之间。这个最大值对应着大约16个小数位,详见Sly1024的回答。
实际上,许多浏览器给出了更小的精度。目前似乎是这样的:
运行下面的代码片段几次,你会发现在Chrome和Safari中,后面的21位总是0。
console.log((Math.random() * Math.pow(2,53)).toString(2));
52*log10(2) ~= 15.653559774527022151114422525674 digits.
Math.random()
在 Javascript 中返回一个浮点数,范围在 0..1
之间,以本机 Javascript 格式表示,这是一种 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 位真正的精度。