擲 100 次骰子(6面),至少出現20次5的概率是多少?

在複習高中的combination,發現現在已經無法理解扔硬幣n次,恰好出現k次的那種問題的解法,索性就問一個高級版的問題。

用python生成隨機數模擬的還是算了,也不要直接扔一個公式算,公式我都懂,但就是不理解裡頭的內在邏輯。


二項分布是什麼原理你記不清這個真的不能賴別人,N次獨立事件里發生了k次,首先從N個事件里選出k個來是C(N,k),這k個發生了,其餘(N-k)個沒有發生,那麼每種子情況概率求和就是

C_N^k p^k(1-p)^{N-k}

按計算器還是寫程序求20個數的和都沒什麼難的,當然中心極限定理也是棒棒的,不過反正還是要查表……


(手機作答)

分解問題:

最少出現20次5→

出現5有20次概率+21次概率+……+100次概率

或者→

最多80次沒出現5,

80次沒出5+79次沒出5+……+0次沒出5

偽通項(參考二項式分解):

C20_100*(1/6)^20*(5/6)^80+…………

C100_100*(1/6)^100*(5/6)^0

我發現我突然不會算上面的求和了

(貌似可以通過一些複雜轉換變成兩個二項式相減的形式?不知道對不對,C的不同底轉換也忘光了,姑且寫一個吧。比如

(1x6+5/6)^100-(1/6+5/6)^19/C20_100*(5/6)^81,不過這個肯定是錯的)。

我大腦運存太低,手頭又沒稿紙沒電腦,先寫到這兒您自個兒算吧。


為什麼不問問神奇的 Wolfram|Alpha 呢?


遇到這種問題一般會考慮用二項分布的正態近似。當實驗次數很大時,這一近似是非常可靠的。100次擲色子得到5服從B(100,1/6)。可以用同均值方差的正態分布近似,其中均值是100/6,方差是100×5/36。然後求N((20-100/6)/sqrt(100×5/36)),就能得到答案了。

以下是 @靈劍 在評論區的補充:

補充一下,比較好的做法是用20.5,而不是20,精度會大大提高。因為其實是20到21之間是分界線嘛……實際算下來,實際值是0.84811,20.0的估計值是0.81445,算是不錯了;然而20.5的精度達到了驚人的0.84816,只差了0.00005……


對於不懂編程,看不懂什麼是Python,然後科學計算器各種overflow,最後只能靠Excel的人來說……

方法A: 首先是暴力計演算法,這個方法原理比較容易理解。

1. 在丟100回骰子的過程中:

  • 出現0(零)次5的概率是(1/6)^0*(5/6)^(100-0)*C(100,0)
  • 只出現 一次5的概率是(1/6)^1*(5/6)^(100-1)*C(100,1)
  • 只出現 兩次5的概率是(1/6)^2*(5/6)^(100-2)*C(100,2)
  • 只出現 三次5的概率是(1/6)^3*(5/6)^(100-3)*C(100,3)

直到

  • 只出現100次5的概率是(1/6)^100*(5/6)^(100-100)*C(100,100)

可以整理出一個formula : 只出現 n次5的概率是(1/6)^n*(5/6)^(100-n)*C(100,n)

= (1^n*5^(100-n)/6^100)*C(100,n)

2. 建立一個excel表格,把上面的公式代入,很容易就可以得到投出各種次數5的概率 。

然後直接sum 20~80 行,或者 1- (sum 1~19行),約為 : 21.975%

附圖:

方法B:Excel其實有一個公式 BINOMDIST,就是計算類似這樣的成功率問題的。

BINOMDIST(n, x, p, cumulative)

這個function計算的是:在x個獨立的Binomial trials里,出現n次或者更少的成功次數的概率

其中

  • n 為非負整數(0或者正整數)
  • x 為正整數 (本例中為100次)
  • 0 &< p &< 1(成功的概率,在本例中為1/6)
  • TRUE 或者 FALSE來控制結果是否累積

「擲 100 次骰子(6面),至少出現20次5的概率」可以理解為「,在100次中,至少20次成功地丟出5的概率」。

然後就可以用這個公式了:

  • P(exactly n successes) 列的公式是BINOMDIST(n, x, p, FALSE),計算正好出現n次5的概率
  • P(n or fewer successes)列的公式是BINOMDIST(n, x, p, TRUE),計算至多出現n次5的概率

  • P(at least n+1 successes)列的公式是1-P(n or fewer successes),計算至少出現n+1次5的概率

所以本題所求至少出現20次5的概率的答案就在第19行,紅字顯示的,21.97498..%


既然題主已經答了我就答一下關於現成函數調用的問題

from scipy.stats import binom
print binom.sf(19,100,1.0/6)

binom是scipy里處理二項分布的類

如果只計算「擲 100 次骰子(6面),恰好出現20次5的概率」可以使用以下函數既二項分布的概率質量函數PMF(probability mass function)

print binom.pmf(20,100,1.0/6)

如果要使用pmf函數求解本題的話可以這樣寫(把20次、21次...100次都加起來)

print sum([binom.pmf(i,100,1.0/6) for i in xrange(20,101)])

對概率密度(質量)函數的積分(求和)就是累積分布函數CDF(cumulative distribution function)如以下代碼是求「擲 100 次骰子(6面),出現5的次數不超過19次(小於20次)的概率」

print binom.cdf(19,100,1.0/6)

那麼自然而然「擲 100 次骰子(6面),至少出現20次5的概率」就是「出現5的次數不超過19次」的對立面,所以代碼就是

print 1-binom.cdf(19,100,1.0/6)

這也有一個名字叫做生存函數 SF(survival function)

print binom.sf(19,100,1.0/6)

也就是關於這個問題最現成的函數

參考 scipy.stats.binom


In[1]:= Sum[5^i Binomial[100, i]/6^100, {i, 0, 80}] // N
Out[1]= 0.21975

如果恰好有80次不是5,那其他5個數字的排列一共有5^80種可能,在100個位置中選80個位置插入一共有Bin(100,80)種方法。所以總的排列方法一共是5^80 Bin(100,80)。

然後考慮79次不是5,......,一直到0次不是5。全加起來除以6^100中可能,最後得到概率是21.975%。


我是題主,學了兩天終於學會了,這題自問自答一個:

首先,先發一個用Python模擬100k次的結果。

如果我的代碼沒錯的話,那稍有常識的人都可以看出,這題的答案在百分之22左右。

數學解法是這樣的:

我用了math module,分別把permutation formula和combination formula變成函數。然後再寫一個二項式概率公式的函數,裡面調用了先前寫的combination的函數

最後我逐個計算從恰好出現20次5的概率,恰好出現21次5的概率,恰好出現22次5的概率……恰好出現100次5的概率,然後把他們相加起來。

最終結果是百分之21.97,這樣就與上面模擬出的結果已經很接近了。

當然最後計算部分還是比較暴力,不知道有沒有更好的方法。

另外,有沒有誰知道以上函數有沒有現成的可以直接調用?


推薦閱讀:

Mobius函數的隨機性和動力系統1
從今天起忘掉運氣,相信概率
Emile Mathieu和他的五個置換群(III)

TAG:數學 | 趣味數學 | 概率 | 組合數學Combinatorics | 概率論 |