原帖的问题:
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,证毕。