【问题标题】:precision of Math.random()Math.random() 的精度
【发布时间】:2011-03-21 15:24:48
【问题描述】:

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

【问题讨论】:

  • Math.random() 是正确的函数。
  • 对,我就是这个意思。谢谢!

标签: javascript random


【解决方案1】:

它取决于浏览器/JavaScript 引擎。

可能的最大精度为 52 位,因为Math.random 返回一个介于 0(包括)和 1(不包括)之间的双精度浮点数。此最大值对应于大约 16 位小数,请参阅 Sly1024 的答案。

实际上,许多浏览器给出的精度较低。这似乎是当前状态:

多次运行以下代码,您会看到在 Chrome 和 Safari 中尾随的 21 位始终为 0。

console.log((Math.random() * Math.pow(2,53)).toString(2));

【讨论】:

  • IE11:52 个随机位,尽管上面的代码有时会给出类似 111000000101010100010110011011110111000111010101110.1 的结果。
  • Chrome 好像提升了精度,我再也观察不到 21 始终为 0 位了。
  • Chrome(以及所有基于 Blink 的浏览器和基于 V8 的产品,例如 Electron-apps 和 Node.js)在 2015 年将 Math.random() 精度更新为 128 位。
【解决方案2】:

根据维基百科:Double-precision floating-point format 小数部分是 52 位,我们知道这个数字将介于 0 和 1 之间(我认为不包括 1),所以指数是 -1,剩下 52 个随机位。

52 个随机位为您提供 52 位精度,以 10 为底大约是

52*log10(2) ~= 15.653559774527022151114422525674 digits.

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • Javascript 浮点数是 64 位 IEEE 754 值,所以它不是精确 16 位小数。
    • @volatile: 如果你的精度不是 10 的幂。
    • @Pointy 这是真的,我的回答不准确。碰撞。
    • 你有这个精度的参考吗?
    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2015-09-24
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多