编程之美 4.1金刚坐飞机问题
问题:
现在有一班飞机将要起飞,乘客们正准备按机票号码(1, 2, 3, …N)依次排队登机。突然来了一只大猩猩(对,他叫金刚)。他也有飞机票,但是他插队第一个登上了飞机,然后随意地选了一个座位坐下了1。根据社会的和谐程度,其他的乘客有两种反应:
1. 乘客们都义愤填膺,“既然金刚同志不遵守规定,为什么我要遵守?”他们也随意地找位置坐下,并且坚决不让座给其他乘客。
2. 乘客们虽然感到愤怒,但还是以“和谐”为重,如果自己的位置没有被占领,就赶紧坐下,如果自己的位置已经被别人(或者金刚同志)占了,就随机地选择另一个位置坐下,并开始闭目养神,不再挪动位置。
那么,在这两种情况下,第 i 个乘客(除去金刚同志之外)坐到自己原机票位置的概率分别是多少?
问题1:
每个人都是随机选择座位,任意一个人坐到指定座位的概率相同,因而第i个乘客坐在其座位的概率是1/n。
问题2:
可将问题转化为“如果金刚坐在第n个位置上,那么第i个乘客坐在自己位置上的概率是多少?
(设此概率为f(n))
下面列举各种情况:
n=1或n>i | 第i乘客必然可以坐到自己的位置上。(f(n)=1) |
n=i | 第i乘客必然坐不到自己的位置上。 (f(n)=0) |
1<n<i | 此情况下又分为两种子情况,看下面的示意图 |
下面是如何计算(1<n<i)下的f(n):
假设N=100,显然f(100)=0
f(99) = 1/2
f(98) = 1/3 + 1/3 * f(99) = 1/2
f(97) = 1/4 + 1/4 * (f(98) + f(99)) = 1/2
……
可以看出f(n)=f(n+1) (1<n<i-1)
看不明白书上的这条通项公式如何推导得出的,知道的大神解答一下!
最后得出:
P=1/n*(f(1) + f(2) + ... + f(99) + f(N))就是第i个乘客坐在自己位置上的概率。
参考文章: