javascript - 将 Number.MAX_SAFE_INTEGER 与 Math.random() 相乘时,我是否可能会丢失任何十进制数字(精度)?

标签 javascript math random numbers

乘以 Number.MAX_SAFE_INTEGER 时,我是否可能会丢失任何十进制数字(精度)?来自 Math.random() 在 JavaScript 中?
我想我不会,但最好能有一个可信的解释来解释为什么 😎
已编辑 , 通俗地说,我们正在处理两个 IEEE 754 double 浮点数,一个是最大整数(对于 double ),另一个是小数点后有很多位的小数。如果(例如)我首先将它们转换为 quadruple-precision format 会怎样? ,然后相乘,再将乘积转换回 double ,结果会不会有什么不同?

const max = Number.MAX_SAFE_INTEGER;
const random = Math.random();
console.log(`\
MAX_SAFE_INTEGER: ${max}, \
random: ${random}, \
product: ${max * random}`);

对于更详细的例子,我用它来生成 BigInt random numbers .

最佳答案

您的实现应该是安全的 - 理论上,如果引擎实现 Math.random,则 0 到 MAX_SAFE_INTEGER 之间的所有数字都应该有可能出现。使用完全无偏的算法。
但是规范并不能保证绝对无偏的算法——所选择的数字是伪随机的,而不是真正的、完全随机的。 (这种东西真的存在吗?这是有争议的......)现代版本 V8 和其他一些实现 use an algorithm周期约为 2 ** 128,大于 MAX_SAFE_INTEGER (2 ** 53 - 1) - 但对于其他实现(尤其是较旧的实现)来说,周期小得多,从而产生某些整数是完全合理的在范围内被采摘的频率比其他人高得多。
如果这对您的脚本很重要(我认为在大多数情况下这不太可能),您可以考虑使用 higher-quality random generatiorMath.random ——但这几乎肯定不值得担心。

关于javascript - 将 Number.MAX_SAFE_INTEGER 与 Math.random() 相乘时,我是否可能会丢失任何十进制数字(精度)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67979269/

相关文章:

javascript - Jquery简单if语句混淆

python - 计算给定谐波节点或多个节点的结果频率,四舍五入到小于 n 的最接近的谐波

random - 如何在 Swift 中播种随机数生成器?

python - 给定 2 个列表,从两个列表中找到一个随机固定大小的子集,使得每个列表中至少有一个值(最好是统一选择)

javascript - ReactJS 和 Material UI makeStyles/useStyles 问题

javascript - ReCaptcha API v2 样式

javascript - 嵌套数组内的 Mongoose findOneAndUpdate

c - 已知范围内的定点乘法

mysql - 实现地理空间/邻近搜索需要什么?

vb.net - 从列表中随机选择一个子集