什么是最小非零值Math.random()可以在javascript中返回

时间:2015-02-27 16:56:56

标签: javascript random

我知道计算机无法使用连续体。 Math.random()javascript函数返回0(包含)和1(独占)之间的浮点数。我想知道它可以返回的最小非零数字是多少。什么"步骤"有这个功能吗?

4 个答案:

答案 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实现提供不同的级别的随机性:

  • V8(Chrome,chromium,node.js):32位(src
  • JavaScriptCore(Safari)32位(src
  • SpiderMonkey(Firefox):53位(src
  • Internet Explorer 53位

虽然某些环境会给你更多,但野外最小公分母 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());