繁体   English   中英

Math.random返回0的几率是多少?

[英]What are the chances of Math.random returning 0?

这个问题的提问者一样,我想知道为什么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()

使用依赖于实现的算法或策略,返回一个正号的Number值,该值大于或等于0但小于1,在该范围内随机选择或伪随机选择,并且在该范围内具有大致均匀的分布。 此函数不带参数。 为不同领域创建的每个Math.random函数必须从连续调用中产生不同的值序列。

在没有完整规范的情况下,无法做出关于Math.random返回零的概率的明确声明。 每个ECMAScript实现都可以选择不同的算法,而无需提供真正统一的分发。

ECMAScript的Number类型使用IEEE-754基本的64位二进制浮点格式。 在此格式中,数字的有效位数(小数部分)具有53位。 每个浮点数的形式为sf •2 e ,其中s (用于符号)为+1或-1, f (用于分数)为有效数字,并且是[0,2 53 )中的整数,而e (对于指数)是[−1074,971]中的整数。 如果设置了f的高位,则该数字被归一化(所以f在[2 52,2 53中 )。 由于负数不在这个答案的担忧,令S是隐含+1这个答案的其余部分。

在[0,1)中分配随机数的一个问题是可代表的值没有均匀分布。 有在[½2个52表示的值,1) -所有那些以f [2 52,2 53)e = -53。 并且在[¼,½)中有相同数量的值-所有在[2 52,2 53 )中fe = -54的值。 由于在此间隔中有相同数量的数字,但间隔是长度的一半,因此数字之间的间隔更近。 同样,在[⅛,¼)中,间距再次减半。 这一直持续到指数达到−1074为止,此时正态数以f = 2 52结尾。 小于该值的数字被认为是次正规的(或零),其中f在[0,2 52 )中且e = −1074,并且它们均匀分布。

关于如何为Math.random分配数字的一种选择是仅对[0,2 53 )中的f使用一组均匀间隔的数字f •2 -53 这将使用[1/2,1)中所有可表示的值,但仅使用[1/4,½)中的一半,[1/3,¼)中的四分之一,依此类推。 这很简单,并且避免了分布中的一些奇怪之处。 如果正确实施,则零概率为2 53

另一种选择是使用[0,1)中的所有可表示值,每个值的概率与从它到下一个更高的可表示值的距离成比例。 因此,将以概率1/2 53选择[1/2,1)中的每个可表示数字,将以概率1/2 54选择[1/4,1/2)中的每个可表示数字,[⅛,¼)中的每个可表示数字以1/2 55的概率被选择,依此类推。 在浮点格式更精细的情况下,此分布近似于实数和提供者更精确的分布。 如果正确实施,则产生零的概率为2 1074中的一

另一种选择是使用[0,1)中的所有可表示值,每个值与段长度成正比,其中可表示值是该段中所有实数的最接近可表示值。 我将省略对这种分布的一些细节的讨论,只是说它模仿一个结果,方法是选择一个具有均匀分布的实数,然后使用“四舍五入关系”将其四舍五入为可表示的值。 。 如果正确实施,则产生零的概率为2 1075中的一 (这种分布的一个问题是,[0,1]中的实数的均匀分布有时会产生一个非常接近1的数字,因此舍入会产生1。这便要求Math.random返回1或可能会以某种方式捏造分布,可能是返回下一个较低的可表示值而不是1。)

我将注意到ECMAScript规范过于宽松,以至于人们可能会断言Math.random可以为每个可表示的值以相等的概率分配数字,而忽略它们之间的间隔。 这根本不会模仿真实数字的均匀分布,我希望很少有人会喜欢它。 但是,如果实施,则返回零的概率是1021•2 52中的1 ,因为存在2 52归一化数字,其指数从-53到-1074( e的 1020值),以及2 52次归一化或零数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM