您的位置:首页 > 其它

【玩味】一道有趣的飞机题

2013-02-02 18:32 766 查看
题目大意是这样的:

飞机上有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一下.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: