傻子坐飛機問題的答案 (還蠻有意思的!)

來源:互聯網
上載者:User

原帖的問題:

100個人排隊乘坐有100個座位的飛機,正常情況時每個都都會對號入坐,但是,第一個上飛機的是個傻子,他隨機坐了一個位子,接下來的人上飛機時,如果自己座位被人坐了就會隨機找個座位坐下,否則就坐自己坐位。問題:最後一個上飛機的人坐到自己座位的機率是多少?? 

 

我的答案:

1. 設F(n)表示當有1個傻子和 n-1個人的時,最後一個人(第n個)能夠坐到自己位置的機率.
2. 既然傻子是隨機坐的,那麼當他是坐了第2個人的位置的時候,第2個人由於不能坐到自己的位置,只能隨機坐其它位置,可以把他看作是第2個"傻子".
    那麼除了第1個傻子外的n-1個人可以看成是 "一個傻子(即找不到位置的第2個人)和剩餘n-2個人",在這情況下最後一個人能夠坐到自己位置的機率是F(n-1),所以如果第一個傻子是坐到第3個人的位置時,第2個人就直接坐自己的位置,第3個人成為"傻子",在這情況下最後一個人能夠坐到自己位置的機率是F(n-2).....
    依此類推,直到如果第一個傻子是坐到第n-1個人的位置時,第n-1個人成為"傻子",最後一個人能夠坐到自己位置的機率是F(2)=0.5 ; 最後,如果傻子是坐的位置都不是其它n-1個人的位置的話,那最後一個人能夠坐到自己位置的機率是1.  而由於傻子是隨機坐的,他坐到每個人的位置的機率都是1/n .
    所以總的來說,最後一個人(第n個)能夠坐到自己位置的機率:
    F(n)= F(n-1)*(1/n) + F(n-2)*(1/n)+...+ F(2)*(1/n) +  1*(1/n);
   即F(n)= (1/n) * ( F(n-1)+F(n-2)+...+F(2)+1);

   代碼如下:
   public double F(int n)
        {
            double s = 0;
            if (n == 2)
            {
                return 0.5;
            }
            else
            {
                for (int i = 2; i < n; i++)
                {
                    s += F(i);
                }
                return (s+1)/(double)(n);
            }
        }

不過得提醒一下各位,由於上面的代碼採用多次遞迴,所以效率非常低,當n=100 時 算了幾分鐘也沒算完,但 算了所有n =2 ~ 30 的所有數的結果都是0.5
所以0.5 是標準答案!

網上其它人的答案:

我的答案是1/2
先給個公式
f(n)=1/n+(1/n)[f(n-1)+f(n-2)+...+f(2)]
f(2)=1/2
解得f(n)=1/2

解釋一下上面的公式:
從傻子開始編號,從100號到1號
把第n個人應該坐的位置編號為第n號座位
把第100號座位叫做"傻子專用座"
傻子有1/100的機率選擇"傻子專用座"(第100號)
則第一個人必定能坐到第1號座位
傻子有1/100的機率選擇其他的座位(假設是第k號)
則第99到第k+1號都會坐自己的座位
第k號選擇的時候,由於第k號座位已經被坐了
我們可以把他當成一個"傻子"
有1/k的機率選擇"傻子專用座"(第100號)
有1/k的機率選到第1號到k-1號座位

基於這種思想
設f(n)是第n號客人面對有n個座位中沒有第n號座位時,第1號客人能坐到第1號座位的機率
f(100)是傻子面對100個座位時,第1號客人能坐到第1號座位的機率
顯然有
f(2)=1/2
f(n)=1/n+(1/n)f(n-1)+(1/n)f(n-2)+(1/n)f(n-3)+...++(1/n)f(3)+(1/n)f(2)

傻子只有一個,沒被佔位置的人不亂坐,直到被佔位置的人上飛機,再亂坐別人位置。那麼沒飛機的人當中最多一個人被佔了位置。如果某個被佔了位置的人坐到傻子位,那麼他不會佔據後面人的位置,後面的人都不會亂坐了。就看傻子位有沒有被佔了。

設x為第n個坐下後傻子位沒有被佔據, y為第n+1個人坐下後傻子位沒有被佔據,
如果x不成立,第n個人坐下後傻子位被佔了,y肯定不發生,第n+1個人肯定坐自己的位置。
p(y) = p(y, x)

x發生說明,第n個後面的有且僅有一個人的座位被佔據了。
y分兩種情況討論,
第一種:第n+1人的座位被佔據,在x發生的條件下發生的機率為1/(100-n), (包括他,有100-n個人沒有坐下,其中一個人位置被占)。他坐到傻子位的幾率是1/(100-n),(這時有100-n個空位,隨機選一個)。y發生是是他沒有做到傻子位,機率: 1/(100-n) * (1 - 1/(100-n) )
第二種:第n+1人的座位沒有被佔據,在x發生的條件下發生的機率為(100-n-1)/(100-n)
p(y|x) = 1/(100-n) * (1 - 1/(100-n) ) + (100-n-1)/(100-n)
       = { (100 - n - 1) / (100 - n) } * { (100 - n + 1) / (100 - n) }

p(y) = p(y, x) = p(y|x) * p(x)

第n+1個人坐下傻子位沒有佔據的機率
p(n+1) = { (100 - n - 1) / (100 - n) } * { (100 - n + 1) / (100 - n) } * p(n)
       = { (100 - n - 1) / (100 - n) } * { (100 - n + 1) / (100 - n) } *
         { (100 - (n - 1) - 1) / (100 - (n - 1) ) } * { (100 - (n - 1) + 1) / (100 - (n - 1) ) } * p(n-1)
       = { (100 - n -1) / (100 - n) } * { (100 - n + 2) / (100 - n + 1) } * p(n-1)
       = ...
       = { (100 - n -1) / (100 - n) } * { (100 - j + 1) / (100 - j) } * p(j)
       = ...
       = { (100 - n -1) / (100 - n) } * { (100 - 1 + 1) / (100 - 1) } * p(1)
       = { (100 - n -1) / (100 - n) } * 100 / 99 * p(1)

p(1)就是傻子坐下後傻子位沒有被佔據的機率
p(1) = 99/100,
p(n+1) = (100 - n - 1) / (100 - n)
p(n) = (100 - n) / (101 - n)
第99個人坐下後傻子位沒有佔據的機率
p(99) = 1/2
所以最後一個人坐到自己位置機率 = 1-p(99) = 0.5

假設p是滿足題目要求的一個n全排列,如1234表示第一個人做1號位置,以此類推,傻子編號為1,全部滿足題目要求的排列集合為{p};

*1、當第k個人上飛機的時候,他不可能做到編號為2到k-1的座位上。
證明:假設他能坐到第i個坐位上(2<=i<=k-1),則表示,第i個人上飛機的時候,第i個座位是空著的,那麼他就該坐到第i個座位上,則第k個人不可能坐到i號上。

推論1:第N個人上飛機的時候,他只能坐在1號或者N

2、用P1,P2等表示第n個人,若Pi佔了Pj的座位,則做有向邊Pi->Pj.形成有向圖G
   2-1;G中任意頂點的度:入度和出度為1或度為0
  *2-2:G中最多存在一個連通分部(G'),包含2個或2個以上的頂點,且P1屬於G'
   2-3:由以上兩點,可知若G'存在,則構成一單向連通的迴圈鏈,若不存在,則補充 定義G'只包含P1.

3、定義p中的一個錯排序列s,滿足:
   (1)第一個元素在序列頭,1在序列中結尾
   (2)除1外,序列中其他元素單調遞增加
   (3)p中不存在比s更長的滿足定義的序列

    舉例:p=1234,s=1;
          p=2134,s=21
          p=3214,s=31
          p=2314,s=231
          p=2341,s=2341

    易見,s的實際意義就是一個排列中,沒有坐在自己座位上的的人的一個“迴圈占坐鏈”,在排列2314中,s=231,表示第1個人佔一2號座位,第2個人佔了第三個座位,而第三個人佔了1號座位。也就是2中定義的單向迴圈鏈G'

4、p和s存在一一對應關係。
   p->唯一s,已經在2中證明了,s->p,也很顯然,因為N中不在s中的數字,必然要在自己原來的位置上,這個排列當然是唯一的。

5、從s到p,方法在4中已經說明了
    舉例N=4:
    s={3,1},{N}-s={2,4},先將2插入到第二個位置,再將4插入到第四個位置
    s={2,3,4,1},{N}-s=空集,所以s本身就是p

*6、推論:假設第k個人佔了1號座位,在他之前被占的最大座位號是q,則從第q+1個人開始,依座位號就座。(很強的結論)

7、s和p的個數
    由s的產生,可s為2到N的一個全組合并上{1},由二項定理,可知對於N,滿足的排列總數為2^(N-1)

*8、 定義s的一個共軛為s'={x|x=1或x不屬於N}
    s={1}.s'={2,3,4,1}
    s={2,1|,s'={3,4,1}
    s={3,1},s'={2,4,1}

   對{s}做一划分,劃分的依據是是否包含4(N),由於s不存在自共軛,立刻可知這兩部分所含元素相等,同為2^(N-2)

9、證明:當最後一人上飛機後,他坐在自己的位置上若且唯若排列p的產生s不包含{N}
充分性:若s不包含N,則s中的最大數q<N-1.根據推論6,當N>=k>=q+1,最後一人必然坐在自己的座位上。

必要性:根據s的定義。

10、由結論8和結論9,可知,此題答案為1/2,證畢。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.