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

什么是Math.random()在javascript中可以返回的最小非零值,javascript,random,Javascript,Random,我知道计算机不能用连续体工作。函数的作用是:返回一个介于0(包含)和1(独占)之间的浮点数。我想知道它能返回的最小非零数是多少。什么“步骤”具有此功能 标准肯定没有表达这个值,因此它取决于实现(在这一点上有点夸张,甚至可能是一个总是返回0.42作为Math.random()结果的实现仍然符合规范) IEEE754格式的64位标准化浮点数可以表示的最小正数为2−1022,即2.2250738585072014×10−308 但是,浮点表示使用不同的分辨率,具体取决于大小 对于接近1的数字,分辨率为

我知道计算机不能用连续体工作。函数的作用是:返回一个介于0(包含)和1(独占)之间的浮点数。我想知道它能返回的最小非零数是多少。什么“步骤”具有此功能

标准肯定没有表达这个值,因此它取决于实现(在这一点上有点夸张,甚至可能是一个总是返回0.42作为
Math.random()
结果的实现仍然符合规范)

IEEE754格式的64位标准化浮点数可以表示的最小正数为2−1022,即2.2250738585072014×10−308

但是,浮点表示使用不同的分辨率,具体取决于大小


对于接近1的数字,分辨率为2-53。可能(只是可能)许多实现选择0到253-1之间的随机整数
n
,并作为结果使用
n/9007199254740992

几乎可以肯定,这不只是选择任何随机浮点

这不能准确地表示随机函数的阶跃,因为它甚至不能接近均匀分布。假设得到2-1022“步长”(适合浮点的最小非零值),加上0.25作为随机值。好吧,这将四舍五入到0.25,因为浮点数不能代表那个精度。所以你有一整条“值”,由于四舍五入,它们都等于0.25。这甚至一点都不统一


我想说的是,更可能的情况是,在指数设置为0的情况下生成一个浮点,尾数为随机位,这将导致步骤2-51(我认为XD)在1(包括)和2(不包括)之间的随机性,然后可以从中减去1。在这种情况下,步骤将是尾数的大小。

我不知道规范说明了什么,但在Chrome、Firefox和IE11控制台上的快速测试表明,精度永远不会超过20位小数

自己测试一下:

for (var i = 0; i < 1000; ++i) console.log(Math.random());
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());
var最小值=1;
对于(var i=0;i<1000000;++i)最小值=Math.min(最小值,Math.random());

使用依赖于实现的算法或策略,返回带正号、大于或等于0但小于1、随机或伪随机选择、在该范围内近似均匀分布的数值。此函数不接受任何参数

Math.random()
返回一个介于0和1之间的
double
。我们可以忽略指数和符号,剩下53个可用位。这意味着在一个完美世界中,数字之间的最小可能步长是
1/2^53==0.000000000000000 1110223024625156540236316680908203125

然而,流行的JavaScript实现提供了不同程度的随机性:

  • V8(Chrome,Chrome,node.js):32位()
  • JavaScriptCore(Safari)32位()
  • SpiderMonkey(Firefox):53位()
  • Internet Explorer 53位
虽然有些环境会给你更多,但最不常见的是32位。即使在服务器上,node.js应用程序也只能获得32位


如果希望应用程序在任何地方都能正确运行,那么可以依赖的最小精度是
1/2^32==0.000000000 23283064365386962890625

我相信在大多数实现中,粒度是2^53。所以答案是2^-53。说
使用依赖于实现的算法或策略,我猜最小的结果是
1/Number。MAX_VALUE
给出的结果(假设结果为非零,例如
5.562684646268003e-309
)浮点值使它变得有趣。对于返回整数的典型C实现,
RAND_MAX
可能低至65535。当然,这会导致大量小小数,但最终粒度为1/65536,大约是4位小数。这个数字在十进制中看起来像这样:0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072014. 它非常小。我发现令人惊讶的是,如果你将十进制字符串传递给字符串到浮点的转换,结果是正确的(当然,即使这是他们使用的测试用例之一)。在哪一方面你不同意?我所说的标准没有涵盖这一点,或者我所说的用双精度数字表示的最小数字是多少?@6502这两部分都是正确的,但第二个问题在这里并不相关,也有点误导,因为它有点暗示你声称这是随机函数的一步。至少,不管怎样,我是这样解释的。编辑了关于(可能)一个实现可以做什么来提取统一随机数的答案。。。那么,浮点存储格式肯定会影响结果吗?(必须找到引用。我知道这会导致对数排列,而不是线性排列。)@Jongware:通过固定指数并随机选择52个尾数位,可以获得均匀排列。稍后您可以规范化表示。我对javascript不太熟悉,但是
console.log
默认情况下只写入20位小数位的可能性有多大?这种测试是确定最小值的非常糟糕的方法。在1.0和10^(-20)之间存在着难以想象的大量数字,因此