連扔1000次硬幣 出現過連續10次正面的概率(遞迴問題求解)
連扔1000次硬幣 出現過連續10次正面的概率(遞迴問題求解)
1、推導一波公式
看到這個問題可以從簡單的情況出發,扔10次,11次……1000次
推匯出概率
P
(
n
)
P(n)
P(n)和
P
(
n
+
1
)
P(n+1)
P(n+1)之間的關係(n為投擲次數)
1、n<10 這種情況肯定是不可能出現連續十次正面,因此
P
(
n
)
=
0
P(n)=0
P(n)=0
2、n=10: 只有一種情況,十次全為正
P
(
n
)
=
0.
5
10
=
1
/
1024
P(n)=0.5^{10}=1/1024
P(n
3、n=11: 有三種情況:1為反,2-11為正;1-10為正,11為反;1-11為正。
這種情況
P
(
11
)
P(11)
P(11)比
P
(
10
)
P(10)
P(10)多了哪些情況呢,當然是第一種情況啦,只有它是P(10)不能滿足的。該情況的概率為
0.5
∗
0.
5
10
0.5*0.5^{10}
0.5∗0.510。
P
(
11
)
=
P
(
10
)
+
0.
5
11
P(11)= P(10)+0.5^{11}
P(11)=P(10)+0.511
4、得到公式
P
(
n
+
1
)
=
P
(
n
)
+
(
1
−
P
(
n
−
10
)
)
/
(
2
11
)
P(n+1) = P(n)+(1-P(n-10))/(2^{11})
公式的含義是:
如果你扔n+1次,得到10或者以上正面的概率是扔n的概率(無論最後一次扔的是什麼,都不會改變前n次拿到10次正面的概率),
加上從1到n-11次都沒有連續10次的概率(這個概率即等於我們計算的
1
−
P
(
n
−
11
)
1-P(n-11)
1−P(n−11)),
乘以最後11扔是1個背面加上10個正面的概率(
1
/
2
11
1/2^{11}
1/211)
2、編寫程式碼計算
/** * @description:連扔1000次硬幣 出現過連續10次正面的概率 * @author: 陶芃宇 * @date: 2020-12-08 19:37 */ public class coins { public static double[] doubles = new double[1000]; public static void main(String[] args){ for (int i = 0; i < 1000; i++) { doubles[i]=formula(i); } System.out.println(doubles[999]); } public static double formula(int n) { if(n<10){ return 0; } else if(n==10) { return Math.pow(0.5, 10); } return doubles[n-1]+(1-doubles[n-11])/2048; } }
3、注意事項
遞迴問題我們可以用陣列將每一步的結果儲存起來,一開始寫這個程式碼的時候直接寫出來一個1000層的遞迴,算了一夜都沒算出來,估計快取超了一直計算不出來,用陣列記憶體後秒出結果。