乘以 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 generatior比Math.random
——但这几乎肯定不值得担心。
关于javascript - 将 Number.MAX_SAFE_INTEGER 与 Math.random() 相乘时,我是否可能会丢失任何十进制数字(精度)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67979269/