javascript - Math.random() 结果的位数
问题描述
for (let i = 0; i < 999; i++) {
console.log("length-result:", (Math.random() + "").slice(2).length)
}
如果你执行这段代码片段,你会发现大部分结果都小于18
.
但是,理论上来说,结果的最后一位数字random()
只有百分之十的机会0
。这意味着,只有百分之十的length-result
s 可以小于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
吗?
解决方案
您正在检查小数点后的位数。它与随机无关。
遵循国际 IEEE 754 标准,JavaScript 数字始终存储为双精度浮点数(64 位)。https://en.wikipedia.org/wiki/IEEE_754
从该链接,在部分:字符表示:
原始二进制值将通过使用以下方法转换为十进制并再次返回来保留:[38]
- binary16 的 5 个十进制数字
- binary32 的 9 位十进制数字
- binary64 的 17 位十进制数字 -> 在 javascript 中使用
- binary128 的 36 位十进制数字
推荐阅读
- javascript - 在导航期间管理表单状态 - Django
- python - 在本地(非 Azure)docker 实例中使用来自 Azure 源的 python 包
- javascript - Webpack configuration in Gatsby, naming conventions
- ios - 'React/RCTBridgeDelegate.h' 文件未找到 React Native 和 XCode
- java - 在 Heroku 上部署 Java Telegram 机器人:无法找到或加载主类
- python - Python:在两个回调之间共享结果
- swift - 在隐式展开可选值时意外发现 nil (UICollectionView)
- java - 如何创建一个 int [](不是 List
) 我的 LinkedList 中的所有对象值? - javascript - 相机在使用 p5.js 的 webview android 中不起作用
- android - Android BroadcastReceiver 仅在使用需要 GPS 的应用时触发