题目大意是这样的:
飞机上有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一下.