1. 程式人生 > 其它 >連扔1000次硬幣 出現過連續10次正面的概率(遞迴問題求解)

連扔1000次硬幣 出現過連續10次正面的概率(遞迴問題求解)

技術標籤:演算法演算法java

連扔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

)=0.510=1/1024
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.50.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})
P(n+1)=P(n)+(1P(n10))/(211)

公式的含義是:
如果你扔n+1次,得到10或者以上正面的概率是扔n的概率(無論最後一次扔的是什麼,都不會改變前n次拿到10次正面的概率),
加上從1到n-11次都沒有連續10次的概率(這個概率即等於我們計算的 1 − P ( n − 11 ) 1-P(n-11) 1P(n11)),
乘以最後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層的遞迴,算了一夜都沒算出來,估計快取超了一直計算不出來,用陣列記憶體後秒出結果。