【玩味】一道有趣的飞机题
2013-02-02 18:32
766 查看
题目大意是这样的:
飞机上有100个座位,编号为1到100;另有100个乘客,标号也是1到100,其中有两个盲人。盲人先登机,随机选择座位坐下,其他乘客一一陆续登机,如果他的座位号没人坐,坐下,否则随机选个空座位坐下。问题:最后一个登机的乘客做到属于自己的座位号的概率。
想了好多种做法,没有一种是对的.
回家的火车上又想了一次,还是错.
于是回家,写了个脚本跑1000000次,结果很惊讶,是 33.xxx% , 接近1/3.
又跑了更多的测试数据,还是在33.xxx%附近, 那么答案应该是1/3了?
附上模拟程序的python代码:
结果是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一下.
飞机上有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一下.
相关文章推荐
- strcpy,一道有趣的面试题
- 发现一道有趣的有关ClassLoador的题
- 有趣的"一道引起全美大学生举国辩论的逻辑题"
- 《The C++ Programming Language, special edition》第6章6.6节中的一道有趣习题ch6.6-15
- 一道有趣的笔试题
- 编程珠玑(第三章)中的有趣的一道练习题(习题8):seven-segment devices
- 今天碰到一道比较有趣的面试题,大家来探讨一下。
- 一道有趣的面试题
- 一道有趣的求符号字符的长度
- 一道有趣的算法题。。。
- 很有趣的一道编程题,子弹分发问题
- 一道有趣的GOOGLE面试题——找出至少一个重复元素
- 一道有趣的面试题,小鸟和火车的问题
- 《一道有趣的面试题》的疑问
- 【白话经典算法系列之十】 一道有趣的GOOGLE面试题
- 一道有趣算法题(转自水源BBS)
- 很有趣的一道编程题,子弹分发问题
- 一道有趣的GOOGLE面试题
- 一道有趣的智能问题
- 一道有趣的木板问题