簡體   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