Isa*_*man 3 javascript random floating-point
就像这个问题的提问者一样,我想知道为什么Math.ceil(Math.random() * 10)不优先于Math.floor(Math.random() * 10) + 1,并发现这是因为 Math.random 有一个很小(但相关)的机会准确返回 0。但有多小?
进一步的研究告诉我,这个随机数精确到小数点后 16 位......好吧,有点。这就是我很好奇的“那种”。
我知道浮点数与小数的工作方式不同。虽然我在细节上挣扎。如果这个数字是一个严格的十进制值,我相信台球的可能性是十分之一(或十千万亿,在美国系统中) - 1:10 16。
这是正确的,还是我搞砸了,或者浮点数有什么不同?
JavaScript 是 ECMAScript 的一种方言。在ECMAScript的262标准没有规定Math.random准确。在第 20.2.2.7 条中,它说:
20.2.2.27 Math.random ( )
返回一个带有正号的数字值,大于或等于 0 但小于 1,使用依赖于实现的算法或策略随机或伪随机选择,在该范围内具有近似均匀的分布。这个函数没有参数。为不同领域创建的每个Math.random函数必须从连续调用中产生不同的值序列。
在没有完整规范的情况下,无法对Math.random返回零的概率做出明确的声明。每个 ECMAScript 实现可以选择不同的算法并且不需要提供真正均匀的分布。
ECMAScript 使用 IEEE-754 基本 64 位二进制浮点格式作为其Number类型。在这种格式中,数字的有效位(小数部分)有 53 位。每个浮点数都具有s • f • 2 e的形式,其中s(表示符号)是 +1 或 ?1,f(表示分数)是有效数并且是 [0, 2 53 ) 中的整数,并且e(对于指数)是 [?1074, 971] 中的整数。如果设置了f的高位(因此f在 [2 52 , 2 53 ) 中),则称该数字已归一化。由于负数不在这个回答一个问题,让小号 对于此答案的其余部分,隐式 +1。
在 [0, 1) 中分布随机数的一个问题是可表示的值不是均匀分布的。[1/2, 1) 中有 2 52 个可表示的值——所有在 [2 52 , 2 53 ) 中有f且e = ?53 的值。并且在 [¼, ½) 中有相同数量的值——所有那些在 [2 52 , 2 53 ) 中都有f并且e = ?54 的值。由于此区间中有相同数量的数字,但区间是其一半长,因此数字之间的间隔更近。同样,在 [?, ¼) 中,间距再次减半。这一直持续到指数达到 ?1074,此时正常数以f = 2 52结束. 小于这个的数字被称为次正规(或零),f在 [0, 2 52 ) 和e = ?1074 中,并且它们是均匀间隔的。
关于如何分配数字的一种选择Math.random是仅使用一组均匀间隔的数字f • 2 ?53 for f in [0, 2 53 )。这使用了 [½, 1) 中所有可表示的值,但只有 [¼, ½) 中值的一半,[?, ¼) 中值的四分之一,依此类推。这很简单,并且避免了分布中的一些奇怪之处。如果正确实施,则产生零的概率为 2 53 分之一。
另一种选择是使用 [0, 1) 中的所有可表示值,每个值的概率与其到下一个更高可表示值的距离成正比。因此,[½, 1) 中的每个可表示数将以1/2 53 的概率被选择,[¼, ½) 中的每个可表示数将以1/2 54 的概率被选择,[?, ¼) 中的每个可表示数将被选择以 1/2 55 的概率被选中,依此类推。这种分布近似于实数和提供者精度的均匀分布,其中浮点格式更精细。如果正确实施,则产生零的概率为 2 1074 分之一。
另一种选择是使用 [0, 1) 中的所有可表示值,每个值的概率与段的长度成正比,其中可表示值是段中所有实数中最接近的可表示值。我将省略对这种分布的一些细节的讨论,只是说它模仿了通过选择具有均匀分布的实数然后使用舍入到最近关系到偶数规则将其舍入到可表示的值而得到的结果. 如果正确实施,则产生零的概率为 2 1075 分之一。(这种分布的一个问题是 [0, 1)中实数上的均匀分布有时会产生一个非常接近 1 的数字,以至于舍入产生 1。这需要要么Math.random 允许返回 1 或以某种方式伪造分布,也许通过返回下一个较低的可表示值而不是 1。)
我会注意到 ECMAScript 规范非常松散,以至于人们可能会断言,Math.random对于每个可表示的值,可能会以相等的概率分布数字,而忽略它们之间的间距。这根本不会模仿实数的均匀分布,我预计很少有人会喜欢它。然而,如果实现的话,概率返回零是一个在1021•2 52,因为有2张52与来自?53指数到?1074规格化数(1020个值ë),和2 52次正规或零号。
| 归档时间: |
|
| 查看次数: |
803 次 |
| 最近记录: |