題目大意是這樣的:
飛機上有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一下.