我知道计算机无法使用连续体。 Math.random()javascript函数返回0(包含)和1(独占)之间的浮点数。我想知道它可以返回的最小非零数字是多少。什么"步骤"有这个功能吗?
答案 0 :(得分:6)
标准肯定不会表达这个值,所以它取决于实现(并且在这一点上夸大了一点,甚至可能是因为Math.random()
的结果仍然符合规范而偏离返回0.42的实现)。
IEEE754格式的64位标准化浮点数可以表示的最小正数是2 -1022 ,即2.2250738585072014×10 -308 。 / p>
然而,浮点表示使用不同的分辨率,具体取决于幅度。
对于接近1的数字,分辨率为2 -53 。可能(只是可能)许多实现选择0到2 53 -1之间的随机整数n
并使用结果n/9007199254740992
。
答案 1 :(得分:1)
几乎可以肯定的是,它不仅仅是挑选任何随机浮动。
这不能准确地表示随机函数的步骤,因为它甚至不会接近均匀分布。假设您得到了2 -1022 “step”(适合浮点数的最小非零值),加上0.25作为随机值。那么,这将被舍入到0.25,因为浮点数不能代表这种准确性。因此,由于四舍五入,你有一整套“值”都等于0.25。这甚至不是一成不变的。
我想说,更有可能的是,在指数设置为0的情况下生成浮点数,尾数的随机位,这将导致步骤2 -51 (我认为XD)之间的随机性1(包括)和2(不包括),然后您可以从中减去1.在这种情况下,步骤将是尾数的大小。
答案 2 :(得分:0)
ECMA provides no guidelines for the precision of randomness:
使用依赖于实现的算法或策略,返回具有正号,大于或等于0但小于1的Number值,随机或伪随机选择,在该范围内具有近似均匀的分布。这个函数不带参数。
Math.random()
返回0到1之间的double
。我们可以忽略指数和符号,我们剩下53个可用位。这意味着完美世界中数字之间的最小可能步长 1/2^53 == 0.00000000000000011102230246251565404236316680908203125
。
但是,流行的JavaScript实现提供不同的级别的随机性:
虽然某些环境会给你更多,但野外最小公分母 32位。即使在服务器上,您的node.js应用程序也只能获得32位。
如果您希望应用程序在任何地方正确运行,您可以依赖的最低精度 1/2^32 == 0.00000000023283064365386962890625
。
答案 3 :(得分:-1)
我不知道规范的内容,但Chrome,Firefox和IE11控制台的快速测试显示,精度永远不会超过20位小数。
自己测试一下:
for (var i = 0; i < 1000; ++i) console.log(Math.random());
或者在大量迭代后查看最小数字:
var smallest = 1;
for (var i = 0; i < 1000000; ++i) smallest = Math.min(smallest, Math.random());