轉載於 http://jarfield.iteye.com/blog/1798180
文章背景
編程之美 4.1 “金剛坐飛機問題”的問題2,難度比問題1大很多。
編程之美的官方解法,包括原理分析、概率公式、推導過程等,感覺闡述不夠詳細,沒有完全讀懂。
搜索一下 “金剛坐飛機”,參考了幾個很不錯的分析,得到一個自己覺得比較完整的答案。
仔細審題
首先,仔細審題,有兩個細節需要搞清楚:
- 飛機上總共有多少座位?N?N+1?還是更多?從問題1的官方解答看,飛機上座位總數爲N。
- “...乘客們正準備按機票編號(1,2,3...N)依次排隊登機。突然來了一隻大猩猩(對,他叫金剛)。他也有飛機票,但是...”,金剛的機票編號是否屬於閉區間[1,N]?換句話說,所有乘客(包括金剛)的總數是N還是N+1?既然座位總數爲N,金剛也有飛機票,飛機也不可能超載,因此,所有乘客(包括金剛)的總數爲N。金剛的機票編號也屬於閉區間[1,N]。
推敲官方答案
然後,看一下編程之美的官方答案:第i個乘客坐在自己位置上的概率爲 。
。
既然飛機座位總數爲N,根據官方答案,第1個乘客的概率爲。實際上,第1個乘客的概率應該爲。計算過程如下:
根據全概率公式,第1個乘客坐在自己座位上的概率:
如何解釋這個問題呢?從問題2的官方解答過程“如果n=1或n>i,那麼第i個乘客坐在自己位置上的概率爲1....”可以推測,官方認爲金剛的機票編號爲1。官方答案中的i應該不包括1。
重新描述問題
到這裏,我重新描述一下問題:
飛機上有N個座位,座位編號依次爲1,2,..N。恰好有N個乘客排隊登機,第1個乘客的座位編號是1,第2個乘客的座位編號是2,...,第N個乘客的座位編號是N。每個乘客都應該坐在編號正確的座位上。但是,第1個乘客是不講道理的金剛,他第一個進入飛機,隨便(隨機)挑了一個座位坐下。其他乘客敢怒不敢言,只好依次找座位坐下。如果自己的座位沒有被佔,則坐自己的作爲,否則,也像金剛那樣隨便挑一個座位。現在,求第i個乘客(第1個乘客還是金剛)坐到自己座位的概率是多少?
我算出的答案爲:
與官方答案是一致的,但是本文會給出更加詳細的計算過程。
概率計算過程
先計算金剛的概率
再計算其他乘客的概率
核心工具是全概率公式
,其中:
- P(K=j)表示,金剛坐在座位j的概率
- P(i|K=j)表示,在金剛坐在座位j上的情況下,第i個乘客坐在座位i的概率
- 如果j=1,也就是說金剛居然坐在了自己的座位上,第i個乘客(其實是所有其他乘客)必然能夠坐到自己座位,因此P(K=j) = 1。
- 如果j=i,也就是說金剛居然坐在了第i個乘客的座位上,第i個乘客肯定不能坐到自己座位,因此P(K=j) = 0。
- 如果j>i,也就是說,金剛坐了(第i個乘客)後面的座位,不影響前面乘客找座位,第i個乘客(其實是第2~j-1個乘客)必然能夠坐到自己座位,因此P(K=j) = 1。
- 如果1<j<i,也就是說,金剛搶了(第i個乘客)前面的座位,肯定會影響第i個乘客(其實是第j~N個乘客)的座位。
這時,只需要計算最後一個條件概率。
難點是計算條件概率
自頂向下計算條件概率
那麼,1<j<i時,P(i|K=j)到底是怎麼計算的呢?下面詳細推導一下j=i-1和j=i-2這兩種情況,其他情況可以順推。
如果金剛坐在了座位i-1上,第i-1個乘客可以選擇座位1、i、i+1~N。每種選擇的概率均等,爲1/(N-i+2):
- 如果第i-1個乘客選擇座位1,則第i個乘客必然能坐到自己座位,概率爲1
- 如果第i-1個乘客選擇座位i,則第i個乘客必然不能坐到自己座位,概率爲0
- 如果第i-1個乘客選擇座位i+1~N,則第i個座位必然能坐到自己座位,概率爲1
- 如果第i-2個乘客選擇座位1,則第i個乘客必然能坐到自己座位,概率爲1
- 如果第i-2個乘客選擇座位i-1,則第i-1個乘客的選擇將影響第i個乘客的概率。此種情況恰好可以遞歸到P(i|K=i-1),只要假設第i-2個乘客就是金剛,它坐在了座位i-1上
- 如果第i-2個乘客選擇座位i,則第i個乘客必然不能坐到自己座位,概率爲0
- 如果第i-2個乘客選擇座位i+1~N,則第i個座位必然能坐到自己座位,概率爲1
如果繼續計算下去,其實可以發現規律,。
挖掘遞歸現象
其實,從上述推導的過程中,我們已經發現遞歸的跡象,是否可以再深入挖掘一下遞歸公式,進而避免繁瑣的推導呢?
如果金剛坐在了座位j上,那麼第j個乘客將會在座位1、j+1~N中隨即選擇一個座位。此時,乘客數量變成N-j+1,座位的數量也是N-j+1,第j個乘客恰好是剩餘乘客的第1個,他變成了新的金剛。我們把他的座位編號從j換成1,這個變換不會影響問題的答案。下面我們來證明這個變換的安全性。
這個變換肯定會影響第j個乘客的概率,但是我們要計算的 並不包括第j個乘客,所以不用考慮這個影響。對於第2~i-1個乘客而言,如果第j個乘客無論是坐在1還是j,他們都可以坐在自己的座位上,對他們來說沒有區別,對他們的概率也沒有任何影響。因此,這個變換是安全的。
從問題的形式上看,變換之後的問題,與原問題等價,只是問題規模從N減小到N-j+1,且每位乘客的編號減小(j-1),座位編號也減小(j-1)。下面詳細描述新問題:
飛機上有N-j+1個座位,座位編號依次爲1,2,..N-j+1。恰好有N個乘客排隊登機,第1個乘客的座位編號是1,第2個乘客的座位編號是2,...,第N-j+1個乘客的座位編號是N-j+1。每個乘客都應該坐在編號正確的座位上。但是,第1個乘客是不講道理的金剛,他第一個進入飛機,隨便(隨機)挑了一個座位坐下。其他乘客敢怒不敢言,只好依次找座位坐下。如果自己的座位沒有被佔,則坐自己的作爲,否則,也像金剛那樣隨便挑一個座位。現在,求第i個乘客(第1個乘客還是金剛)坐到自己座位的概率是多少?
利用遞歸形式計算條件概率
這裏引入了一個新的變量n,表示乘客的總數。我們令F(i,n)表示在乘客總數爲n的情況下,第i個乘客坐到自己座位的概率。顯然,P(i) = F(i,N)。
下面,我們開始計算F(i,n),首先將P(i,N)計算結果中的N替換成n,然後利用子問題的遞歸形式。
因此,我們有
結合金剛的概率,我們得到完整答案: