標籤:src 結束 image javascrip 相同 隨機數產生 主持人 產生 ima
前言
大歡哥的題目完成了,但是衍生出一個新的問題!上篇隨筆中我和大歡哥採用的隨機數產生方式,到底是誰的比較公平???
本文
歡迎來到阿段部落格《奇思妙想》!我們的口號是 “心有多大,bug就有多大”!
下面介紹我們的嘉賓:
小鵬哥,小鵬哥來自xxxxxx,取得xxxxxx(一堆頭銜)。前端老司機。大家鼓掌歡迎歡迎我們的小鵬哥,papapa....(小鵬哥沒有大歡哥高大,但是小鵬哥有個高大的內心,從座駕便可以看出來)。
大歡哥,大歡哥前面介紹了,現在不用介紹了(大歡哥此時心裡有一句 “我去,不介紹我”,嘿嘿嘿嘿.....,開個玩笑),我們的大歡哥來自xxxxxxxx,取得xxxxxx(一堆頭銜)。Java老司機。大家鼓掌歡迎歡迎我們的大歡哥,papapa....(大歡哥高大威武,但是內心柔軟,老規矩還是座駕看出來的)。
論題:如題(嘿嘿嘿....)
論題代碼:
1 var ran1 = Math.floor(Math.random()*a.length);//方式一2 3 var ran2 = Math.round(Math.random()*(a.length-1));//方式二
註:此處假設 JavaScript 中 Math.random() 產生的隨機數在0-1之間,絕對公平。a為長度為4的數組。
代碼陳述:
方式一:在0到1之間產生一個隨機數(假設絕對公平)。用隨機數乘於 a 的長度,最後取整。大歡哥代碼!
方式二:在0到1之間產生一個隨機數(假設絕對公平)。用隨機數乘於 a 的長度減一 ,最後四捨五入取整數。My Code,小鵬哥代我論證。
大歡哥:主持人,不對啊,人家的長度為 4,你為什麼要減去一個啊,這樣對人家數組 a 最後一個元素不公平啊!
小鵬哥:咦,哎呀。我去。聽他這麼說好像,也許,或許是有那麼點不公平啊....(思考中)!
好的!兩位嘉賓都覺得方式二不公平,那麼兩位嘉賓改論證一下方式二為什麼不公平了!兩位嘉賓擼袖子,拿筆拿紙中...
.
.
.
.
(原諒我口才有限,直接說論證結果吧!)
邏輯概念圖:
看圖理思維:
方式一把 a數組 抽象分為 四份!每一份的間距一樣(一,二,三,四)!當 Math.random() 產生的隨機數,可以均勻的落在四個區間(距離等距)每個區間的機率都為 25% ,所以,隨機產生的隨機數只要在Math.random函數假設公平下,方式一產生的隨機數,就很公平!
結論:
值 |
對應區間 |
機率 |
0 |
第一區間 |
25% |
1 |
第二區間 |
25% |
2 |
第三區間 |
25% |
3 |
第四區間 |
25% |
方式二把 a數組 抽象分為了 三份(length-1)!每一份的間距雖然也相等(三分之一:33.333333%),但是在 Math.round() 四捨五入後,要想落在第一個區間(0~0.5)的機率只有33.3333333333.........%/2=16.666666666.......%!相同的要落在第四個區間的機率也為 33.3333333333.....%/2=16.66666........%;也就是 再假設 Math.random() 絕對公平的情況下,要想獲得 0 或者 3 的機率只有 16.6666666.....% ,而 2 和 3 的機率卻高達 33.333333333......%。
結論:
值 |
對應區間 |
機率 |
0 |
第一區間 |
16.6666666666% |
1 |
第二區間 |
33.3333333333% |
2 |
第三區間 |
33.3333333333% |
3 |
第四區間 |
16.6666666666% |
感謝大歡哥和小鵬哥的精彩論證,難怪你年會沒抽到獎。原來是你用錯API了。。本期阿段部落格《奇思妙想》到此結束。謝謝!大家下期再見......
結論
綜合以上論證所得,在 Math.random() 絕對公平的情況下。方式一方式二絕對公平!!!
對於以上結果,只相對於理論驗證,沒有實際資料驗證,如有不同意見,歡迎指出!!!
《奇思妙想》論JavaScript取隨機數的相對公平性!!!