【玩味】一道有趣的飛機題

題目大意是這樣的:

飛機上有100個座位,編號爲1到100;另有100個乘客,標號也是1到100,其中有兩個盲人。盲人先登機,隨機選擇座位坐下,其他乘客一一陸續登機,如果他的座位號沒人坐,坐下,否則隨機選個空座位坐下。問題:最後一個登機的乘客做到屬於自己的座位號的概率。


想了好多種做法,沒有一種是對的.

回家的火車上又想了一次,還是錯.

於是回家,寫了個腳本跑1000000次,結果很驚訝,是 33.xxx% , 接近1/3.

又跑了更多的測試數據,還是在33.xxx%附近, 那麼答案應該是1/3了?

附上模擬程序的python代碼:

import random

def aboard():
  p = [0 for i in range(101)]
  empty_seats = [i+1 for i in range(100)]
  # can the blinds be No.100?
  blind_A = random.randint(1,100)
  blind_B = blind_A
  while blind_B == blind_A:
    blind_B = random.randint(1,100)
  
  # the Blinds chose seats
  a = random.choice(empty_seats)
  empty_seats.remove(a)
  b = random.choice(empty_seats)
  empty_seats.remove(b)
  p[blind_A] = a
  p[blind_B] = b
  # the normal guys
  for i in range(3,101):
    # passenger No.i
    if i in empty_seats: # seat i is empty
      p[i] = i
      empty_seats.remove(i)
    else:
      r = random.choice(empty_seats)
      empty_seats.remove(r)
      p[i] = r

  if p[100] == 100:
    return True
  else:
    return False

n = int(raw_input('n -- num of cases:'))

yes = 0
no = 0
for i in range(n):
  if aboard():
    yes += 1
  else:
    no += 1

print yes,no, yes*1.0/(yes+no)

結果是1/3.


那麼怎麼解呢?

我想了一個可能的做法(不一定對,求拍磚):


1.先考慮只有3個人(2個盲人)的情況.那麼這種情況下最後一個人坐到正確座位的情況一共有 2種 ( 1,2,3 ) 和 (2,1,3)

而3個人的話,第三個人的座位已經被前2個人決定,那麼所有可能的座位安排可能,就是3的全排列,一共A(3,3) = 6 種

故3個人的情況,最後一個人坐對位置的概率是1/3.


2. 現在有100個人(還是2個盲人). 考慮那些坐錯了別人位置的人, 由題意,他們的錯都是由於上一個人的錯(如果沒有人坐錯他位置,他是會本分地坐到自己位置上的),那麼如此遞歸找下去可以找到一個"罪魁禍首". 這個罪魁禍首隻可能是那2個盲人啦.  於是,可以用2個鏈條把這些坐錯位置的人串起來, 每個盲人一根,頭節點是盲人,尾節點是 坐到了盲人位置上 的人(因爲坐到了盲人位置上,就不會繼續傳遞這種錯誤了,一個輪迴).

這裏我們可以把每根鏈條想象成只有一個人(可以想象嗎?不行的話,先接受這個設定吧).

那麼,除了2根鏈條,其他還有100號,還有其他的"本分"旅客.  

考慮那些本分的旅客----他們對這個結果一點貢獻都沒有對嗎?能影響結局的只有那些坐錯的人,所以把他們去掉.

現在只剩下3個"人"了, 鏈條1, 鏈條2, 還有100號.

問題回到了3個人的模型那裏. 答案就是 1/3 .

暫時想到這裏,先record一下.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章