傻子坐飞机问题的答案 (还蛮有意思的!)

原帖的问题:

100个人排队乘坐有100个座位的飞机,正常情况时每个都都会对号入坐,但是,第一个上飞机的是个傻子,他随机坐了一个位子,接下来的人上飞机时,如果自己座位被人坐了就会随机找个座位坐下,否则就坐自己坐位。问题:最后一个上飞机的人坐到自己座位的概率是多少?? 

 

我的答案:

1. 设F(n)表示当有1个傻子和 n-1个人的时,最后一个人(第n个)能够坐到自己位置的概率.
2. 既然傻子是随机坐的,那么当他是坐了第2个人的位置的时候,第2个人由于不能坐到自己的位置,只能随机坐其它位置,可以把他看作是第2个"傻子".
    那么除了第1个傻子外的n-1个人可以看成是 "一个傻子(即找不到位置的第2个人)和剩余n-2个人",在这情况下最后一个人能够坐到自己位置的概率是F(n-1),所以如果第一个傻子是坐到第3个人的位置时,第2个人就直接坐自己的位置,第3个人成为"傻子",在这情况下最后一个人能够坐到自己位置的概率是F(n-2).....
    依此类推,直到如果第一个傻子是坐到第n-1个人的位置时,第n-1个人成为"傻子",最后一个人能够坐到自己位置的概率是F(2)=0.5 ; 最后,如果傻子是坐的位置都不是其它n-1个人的位置的话,那最后一个人能够坐到自己位置的概率是1.  而由于傻子是随机坐的,他坐到每个人的位置的概率都是1/n .
    所以总的来说,最后一个人(第n个)能够坐到自己位置的概率:
    F(n)= F(n-1)*(1/n) + F(n-2)*(1/n)+...+ F(2)*(1/n) +  1*(1/n);
   即F(n)= (1/n) * ( F(n-1)+F(n-2)+...+F(2)+1);

   代码如下:
   public double F(int n)
        {
            double s = 0;
            if (n == 2)
            {
                return 0.5;
            }
            else
            {
                for (int i = 2; i < n; i++)
                {
                    s += F(i);
                }
                return (s+1)/(double)(n);
            }
        }

不过得提醒一下各位,由于上面的代码采用多次递归,所以效率非常低,当n=100 时 算了几分钟也没算完,但 算了所有n =2 ~ 30 的所有数的结果都是0.5
所以0.5 是标准答案!

网上其它人的答案:

我的答案是1/2
先给个公式
f(n)=1/n+(1/n)[f(n-1)+f(n-2)+...+f(2)]
f(2)=1/2
解得f(n)=1/2

解释一下上面的公式:
从傻子开始编号,从100号到1号
把第n个人应该坐的位置编号为第n号座位
把第100号座位叫做"傻子专用座"
傻子有1/100的概率选择"傻子专用座"(第100号)
则第一个人必定能坐到第1号座位
傻子有1/100的概率选择其他的座位(假设是第k号)
则第99到第k+1号都会坐自己的座位
第k号选择的时候,由于第k号座位已经被坐了
我们可以把他当成一个"傻子"
有1/k的概率选择"傻子专用座"(第100号)
有1/k的概率选到第1号到k-1号座位

基于这种思想
设f(n)是第n号客人面对有n个座位中没有第n号座位时,第1号客人能坐到第1号座位的概率
f(100)是傻子面对100个座位时,第1号客人能坐到第1号座位的概率
显然有
f(2)=1/2
f(n)=1/n+(1/n)f(n-1)+(1/n)f(n-2)+(1/n)f(n-3)+...++(1/n)f(3)+(1/n)f(2)

傻子只有一个,没被占位置的人不乱坐,直到被占位置的人上飞机,再乱坐别人位置。那么没飞机的人当中最多一个人被占了位置。如果某个被占了位置的人坐到傻子位,那么他不会占据后面人的位置,后面的人都不会乱坐了。就看傻子位有没有被占了。

设x为第n个坐下后傻子位没有被占据, y为第n+1个人坐下后傻子位没有被占据,
如果x不成立,第n个人坐下后傻子位被占了,y肯定不发生,第n+1个人肯定坐自己的位置。
p(y) = p(y, x)

x发生说明,第n个后面的有且仅有一个人的座位被占据了。
y分两种情况讨论,
第一种:第n+1人的座位被占据,在x发生的条件下发生的概率为1/(100-n), (包括他,有100-n个人没有坐下,其中一个人位置被占)。他坐到傻子位的几率是1/(100-n),(这时有100-n个空位,随机选一个)。y发生是是他没有做到傻子位,概率: 1/(100-n) * (1 - 1/(100-n) )
第二种:第n+1人的座位没有被占据,在x发生的条件下发生的概率为(100-n-1)/(100-n)
p(y|x) = 1/(100-n) * (1 - 1/(100-n) ) + (100-n-1)/(100-n)
       = { (100 - n - 1) / (100 - n) } * { (100 - n + 1) / (100 - n) }

p(y) = p(y, x) = p(y|x) * p(x)

第n+1个人坐下傻子位没有占据的概率
p(n+1) = { (100 - n - 1) / (100 - n) } * { (100 - n + 1) / (100 - n) } * p(n)
       = { (100 - n - 1) / (100 - n) } * { (100 - n + 1) / (100 - n) } *
         { (100 - (n - 1) - 1) / (100 - (n - 1) ) } * { (100 - (n - 1) + 1) / (100 - (n - 1) ) } * p(n-1)
       = { (100 - n -1) / (100 - n) } * { (100 - n + 2) / (100 - n + 1) } * p(n-1)
       = ...
       = { (100 - n -1) / (100 - n) } * { (100 - j + 1) / (100 - j) } * p(j)
       = ...
       = { (100 - n -1) / (100 - n) } * { (100 - 1 + 1) / (100 - 1) } * p(1)
       = { (100 - n -1) / (100 - n) } * 100 / 99 * p(1)

p(1)就是傻子坐下后傻子位没有被占据的概率
p(1) = 99/100,
p(n+1) = (100 - n - 1) / (100 - n)
p(n) = (100 - n) / (101 - n)
第99个人坐下后傻子位没有占据的概率
p(99) = 1/2
所以最后一个人坐到自己位置概率 = 1-p(99) = 0.5

假设p是满足题目要求的一个n全排列,如1234表示第一个人做1号位置,以此类推,傻子编号为1,全部满足题目要求的排列集合为{p};

*1、当第k个人上飞机的时候,他不可能做到编号为2到k-1的座位上。
证明:假设他能坐到第i个坐位上(2<=i<=k-1),则表示,第i个人上飞机的时候,第i个座位是空着的,那么他就该坐到第i个座位上,则第k个人不可能坐到i号上。

推论1:第N个人上飞机的时候,他只能坐在1号或者N

2、用P1,P2等表示第n个人,若Pi占了Pj的座位,则做有向边Pi->Pj.形成有向图G
   2-1;G中任意顶点的度:入度和出度为1或度为0
  *2-2:G中最多存在一个连通分部(G'),包含2个或2个以上的顶点,且P1属于G'
   2-3:由以上两点,可知若G'存在,则构成一单向连通的循环链,若不存在,则补充 定义G'只包含P1.

3、定义p中的一个错排序列s,满足:
   (1)第一个元素在序列头,1在序列中结尾
   (2)除1外,序列中其他元素单调递增加
   (3)p中不存在比s更长的满足定义的序列

    举例:p=1234,s=1;
          p=2134,s=21
          p=3214,s=31
          p=2314,s=231
          p=2341,s=2341

    易见,s的实际意义就是一个排列中,没有坐在自己座位上的的人的一个“循环占坐链”,在排列2314中,s=231,表示第1个人占一2号座位,第2个人占了第三个座位,而第三个人占了1号座位。也就是2中定义的单向循环链G'

4、p和s存在一一对应关系。
   p->唯一s,已经在2中证明了,s->p,也很显然,因为N中不在s中的数字,必然要在自己原来的位置上,这个排列当然是唯一的。


5、从s到p,方法在4中已经说明了
    举例N=4:
    s={3,1},{N}-s={2,4},先将2插入到第二个位置,再将4插入到第四个位置
    s={2,3,4,1},{N}-s=空集,所以s本身就是p

*6、推论:假设第k个人占了1号座位,在他之前被占的最大座位号是q,则从第q+1个人开始,依座位号就座。(很强的结论)

7、s和p的个数
    由s的产生,可s为2到N的一个全组合并上{1},由二项定理,可知对于N,满足的排列总数为2^(N-1)

*8、 定义s的一个共轭为s'={x|x=1或x不属于N}
    s={1}.s'={2,3,4,1}
    s={2,1|,s'={3,4,1}
    s={3,1},s'={2,4,1}

   对{s}做一划分,划分的依据是是否包含4(N),由于s不存在自共轭,立刻可知这两部分所含元素相等,同为2^(N-2)

9、证明:当最后一人上飞机后,他坐在自己的位置上当且仅当排列p的生成s不包含{N}
充分性:若s不包含N,则s中的最大数q<N-1.根据推论6,当N>=k>=q+1,最后一人必然坐在自己的座位上。

必要性:根据s的定义。

10、由结论8和结论9,可知,此题答案为1/2,证毕。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值