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

题目大意是这样的:

飞机上有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一下.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值