原帖的問題:
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,證畢。