首页 > 解决方案 > Math.random() 结果的位数

问题描述

for (let i = 0; i < 999; i++) {
    console.log("length-result:", (Math.random() + "").slice(2).length)
}

如果你执行这段代码片段,你会发现大部分结果都小于18.

但是,理论上来说,结果的最后一位数字random()只有百分之十的机会0。这意味着,只有百分之十的length-results 可以小于18

实时片段:

// Why are results of length 20 rare, rather than occurring ~90% of the time?

for (let i = 0; i < 999; i++) {
  const str = Math.random() + '';
  tbody.insertAdjacentHTML('beforeend', `<tr><td>${str.length}</td><td>${str}</td></tr>`);
}
td {
  padding-right: 20px;
}
<table>
  <tbody id="tbody">
  </tbody>
</table>

你能告诉我是什么导致了这种行为Math.random吗?

标签: javascriptrandom

解决方案


您正在检查小数点后的位数。它与随机无关。

遵循国际 IEEE 754 标准,JavaScript 数字始终存储为双精度浮点数(64 位)。https://en.wikipedia.org/wiki/IEEE_754

从该链接,在部分:字符表示

原始二进制值将通过使用以下方法转换为十进制并再次返回来保留:[38]

  • binary16 的 5 个十进制数字
  • binary32 的 9 位十进制数字
  • binary64 的 17 位十进制数字 -> 在 javascript 中使用
  • binary128 的 36 位十进制数字

推荐阅读