擲 100 次骰子(6面),至少出現20次5的概率是多少?
在複習高中的combination,發現現在已經無法理解扔硬幣n次,恰好出現k次的那種問題的解法,索性就問一個高級版的問題。
用python生成隨機數模擬的還是算了,也不要直接扔一個公式算,公式我都懂,但就是不理解裡頭的內在邏輯。
二項分布是什麼原理你記不清這個真的不能賴別人,N次獨立事件里發生了k次,首先從N個事件里選出k個來是C(N,k),這k個發生了,其餘(N-k)個沒有發生,那麼每種子情況概率求和就是
(手機作答)
分解問題:最少出現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%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.binomIn[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次的結果。數學解法是這樣的:
最後我逐個計算從恰好出現20次5的概率,恰好出現21次5的概率,恰好出現22次5的概率……恰好出現100次5的概率,然後把他們相加起來。
最終結果是百分之21.97,這樣就與上面模擬出的結果已經很接近了。
當然最後計算部分還是比較暴力,不知道有沒有更好的方法。
另外,有沒有誰知道以上函數有沒有現成的可以直接調用?推薦閱讀:
※Mobius函數的隨機性和動力系統1
※從今天起忘掉運氣,相信概率
※Emile Mathieu和他的五個置換群(III)
TAG:數學 | 趣味數學 | 概率 | 組合數學Combinatorics | 概率論 |