题目:飞机座位分配概率
有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。
剩下的乘客将会:
如果他们自己的座位还空着,就坐到自己的座位上,
当他们自己的座位被占用时,随机选择其他座位
第 n 位乘客坐在自己的座位上的概率是多少?
示例
示例 1:
输入:n = 1
输出:1.00000
解释:第一个人只会坐在自己的位置上。
示例 2:
输入: n = 2
输出: 0.50000
解释:在第一个人选好座位坐下后,第二个人坐在自己的座位上的概率是 0.5。
提示:
1 <= n <= 10^5
使用JavaScript语言
/**
* @param {number} n
* @return {number}
*/
var nthPersonGetsNthSeat = function(n) {
if(n == 1){
return parseFloat(n);
}else{
var p = 1;
for(var i = 2;i <= n; i++){
p = (1 + p*(i-2))/i
}
return parseFloat(p)
}
};
分析
本题是使用了数学归纳法,这题我也是看大佬们的分析才看懂的。
大佬的分析:
对于第一个乘客来说 他有三种选择
坐在正确的(自己的位置), 那么后面的乘客都不会乱,所以第n个乘客可以坐到自己的位置, 1/n * 1.
坐在第n个乘客的位置,那么第n个乘客肯定无法坐到自己的位置, 1/n * 0.
坐在[1,n-1]之间的某个位置K.
对于第K个乘客而言,自己的位置K已经被乘客1给占了,而[2,K-1]的乘客先于K乘客 上飞机,能找到自己的位置并坐下,所以当K乘客上飞机时,留给他的选择是
第1个座位,以及[K+1,n]的座位。
此时K乘客同样有3个选择,
如果他坐在正确的座位,那么后面的乘客都不会乱,第n个乘客可以坐到自己的位置,
只不过此时对于K乘客而言,正确的座位就是座位1。
坐在第n个乘客的位置,那么第n个乘客肯定无法坐到自己的位置
坐在[K+1,n-1]之间的某个位置。
可以发现对于第一个乘客和第K个乘客,他们面临的选择是一样的,只不过问题的规模不一样。第K个乘客时,问题的规模只有n-K+1. (为何, 上面已经解释过了,对于第K个乘客而言,自己的位置K已经被乘客1给占了,而[2,K-1]的乘客先于K乘客 上飞机,能找到自己的位置并坐下)。
所以此题公式为
p[1] = 1.0;
p[2] = 0.5;
p[3] = 1/3 + p[2]/3 = 0.5;
p[4] = 1/4 + p[2]/4 + p[3]/4 = 0.5
进行简单的模拟:一共100个人
①当1(序号代表的是第几位乘客)占了1号的位子时(由于是随便选所以也可以选1),100号的乘客一定可以做到自己的位置上面,所以此时概率为1
②如果1坐到了2上面,那么2就会有两类选择:占据1或者3~100之间的任一个位置:
如果2占据了1,那么就可以看做1~2是没有问题的,100也可以坐到100上面
如果2占据了5,那么就可以看做1~4没有问题,继续分析的是(5~100)之间的问题,
相当于5号乘客没有自己的位子坐,只能坐前面一个或者6~100之间的一个位子,
但是5可以选前面的一个位置,说明该问题又可以等效于5在5~100里面选一个位子,
就是1~95里面的问题
如果任选一个k(3 <= k <= 100)那么就要继续分析剩余的子问题
其实这道题目到最后可以归为:
if(n == 1){
return parseFloat(n);
}else{
return parseFloat(0.5)
}