哎呀我做的好复杂,肯定是多绕了很多圈子,就是死算 (聊天灌水) 264次阅读
观看【白沙纱】的博客假定f(n)是指一共有n个人时,最后一个人(第n个人)坐到最后一个座位(第n个座位)的概率。f(100)就是题目。
则有
f(n)=sum(p(i)*f(n|i): i=1..n) ----(a)
其中
f(n|i)是第一个人选择第i个座位时,最后一个人(n)能坐在最后一个座位(n)的条件概率。
p(i)是第一个人选择第i个座位的概率,p(i)=1/n, for i=1..n
------------------------
然后就是简化理解f(n|i), 对于n>1:
当i=1的时候,也就是第一个人坐在第1个座位,后面全正确了,所以f(n|1)=1;
当i=n的时候,第n个人位置被第一个人占了(实际上最后那人肯定得坐在第一个座位,但读者此时不需要知道这个), 所以f(n|n)=0;
当i=2时,也就是第一个人坐了第二个座位, 那第二个人就有(n-2+1)种选择了: 第一个座位和3..n的座位。
从第二个人选择的情况, 和最初一共有(n-2+1)个人然后从第一个人开始选择的情况是等价的。这句话表达不清楚,就举个例子把:
假如n=5, i=2, 求f(5|2)
此时,第二个人可以选择1,3,4,5四个座位, 第五个人坐在第5个座位的概率,就等价于
有1,2,3,4四个座位,从第一个人开始选择算起,求第四个人坐在第4个座位的概率(这个概率是f(4)哈)。
f(5|2)=f(4)
推广到n, 就是f(n|2)=f(n-2+1)
同理,当i>2时,也即第一个人坐了第i个座位,那1和i之间的人(不包括1和i)都会坐自己正确的位置,原本应该坐在i位置的人(如前记做第i个人) 就面临(n-i+1)种选择, 从他开始的情况就和f(n-i+1)等价。
则f(n|i)=f(n-i+1) ,对 2<=i 就可以得到递推公式了。 =>f(n)=(1/n)*(1 + sum(f(n-i+1): i=2..n-1) + 0) =>f(n)=(1/n)*(1+sum(f(i): i=2..n-1))
带入(a)
又已知f(1)=1
f(n)=(1/n)*(f(n|1) + sum(f(n|i) : i=2..n-1) + f(n|n))
初始值
f(2)=0.5
然后就可以用程序递归了。
当然也可以手算做几个就知道都一样不用继续做下去了。
完整帖子:
- 题来了:100个座位 - 白沙纱, 2015-05-14
- 俺笨又不爱动脑筋, 管那99个人坐哪儿呢, 我的座位要么空着, 要么被占, 我有一半的几率坐在自己票座位上. - 灶君, 2015-05-14
- 99不是问题,n>2都一样的,100只是方便说法。 - 白沙纱, 2015-05-14
- 沙纱你是咋做的?发上来我学习一哈。 - 剑剑风流, 2015-05-14
- 哎呀我做的好复杂,肯定是多绕了很多圈子,就是死算 - 白沙纱, 2015-05-15
- 你好厉害,女娃娃想这么复杂的公式啊,我看得一个头两个大。我想到你说的那种方法了,写在下头。 - 剑剑风流, 2015-05-15
- 就是排版不行,用手写就容易看了,我的方法就好比鸡兔同笼直接用一元二次方程,思路容易理解,但是算起来复杂 - 白沙纱, 2015-05-15
- 你好厉害,女娃娃想这么复杂的公式啊,我看得一个头两个大。我想到你说的那种方法了,写在下头。 - 剑剑风流, 2015-05-15
- 哎呀我做的好复杂,肯定是多绕了很多圈子,就是死算 - 白沙纱, 2015-05-15
- 沙纱你是咋做的?发上来我学习一哈。 - 剑剑风流, 2015-05-14
- 99不是问题,n>2都一样的,100只是方便说法。 - 白沙纱, 2015-05-14
- 题目说旅客们按顺序依次就座,那么只有两个可能,一个是 - 丽桥游子, 2015-05-14
- 是很简单的, 不过不是没票的人, 是最后那个人。哈 - 白沙纱, 2015-05-14
- 原来我自己简化了题目,哈哈:) - 丽桥游子, 2015-05-15
- 是很简单的, 不过不是没票的人, 是最后那个人。哈 - 白沙纱, 2015-05-14
- 简化为两个人坐两个座位。一人没票先坐,剩下那个当然是百分之五十的概率。 - 小木, 2015-05-14
- 恩, 先两人再递归 - 白沙纱, 2015-05-14
- 俺试着来解释一下。:) - 秋叶静美, 2015-05-14
- 看明白了,太牛了, 困扰我好几天的问题终于理解了, 谢谢秋叶。 - 白沙纱, 2015-05-14
- 是的!非常牛!题也很有意思。那边的接龙俺是一题也没赶上,郁闷呀! - YY老爸, 2015-05-16
- 解释得很清楚啊! - 剑剑风流, 2015-05-14
- 看明白了,太牛了, 困扰我好几天的问题终于理解了, 谢谢秋叶。 - 白沙纱, 2015-05-14
- 我写了程序,运行结果就是0.5 (50%)。程序见内,有兴趣的亲可以用Java运行一下。 - 修理小子, 2015-05-14
- 腻害!我要把这个程序当做学习的样本, 谢谢酒哥 - 白沙纱, 2015-05-14
- 呵呵,一个简单的递归程序而已。关键是“我能否坐到我的座位取决于前一个人坐我座位的概率”。这就是递归。传递到极限条件就是第二个人,第二个人能否坐自己的座位取决于第一个人是否坐了他的座位。两个人就是总共两个座位,所以概率50%。回归到第三人的概率取决于第二人,那么最后回归到100个,大家取决于前一个,那么就都是50%。如果每次计算的时候概率有所变化的话,人脑就不够用了,必须要运行这个程序了。 - 修理小子, 2015-05-14
- 如果有N个人,那么就取决于前一个人“不坐”自己座位的概率,这个好像有点太直接 - 白沙纱, 2015-05-14
- (*^__^*) 嘻嘻……,其实我没看懂,到目前为止只看懂了秋叶的解释。汗,我再想想哦 - 白沙纱, 2015-05-14
- 如果有N个人,那么就取决于前一个人“不坐”自己座位的概率,这个好像有点太直接 - 白沙纱, 2015-05-14
- 呵呵,一个简单的递归程序而已。关键是“我能否坐到我的座位取决于前一个人坐我座位的概率”。这就是递归。传递到极限条件就是第二个人,第二个人能否坐自己的座位取决于第一个人是否坐了他的座位。两个人就是总共两个座位,所以概率50%。回归到第三人的概率取决于第二人,那么最后回归到100个,大家取决于前一个,那么就都是50%。如果每次计算的时候概率有所变化的话,人脑就不够用了,必须要运行这个程序了。 - 修理小子, 2015-05-14
- 第N个人能否坐自己的座位取决于N-1个人是否不坐自己的概率,似乎这个应该是需要推论的结果而不是依据吧?为什么可以这样递归呢?是不是跟随机种子的同等性有关? - 剑剑风流, 2015-05-14
- 腻害!我要把这个程序当做学习的样本, 谢谢酒哥 - 白沙纱, 2015-05-14
- 我想到了一个不用公式,简单就能理解的方法。 - 剑剑风流, 2015-05-15
- 高大上!! 这下不用思考就能理解了,可以作为秋叶答案的补充。你们都太聪明啦,怪不得我找不到工作呢 - 白沙纱, 2015-05-15
- 还是剑剑聪明,这个解释最明白通俗。兄弟好样的! - 修理小子, 2015-05-15
- 怕动脑筋的看热闹。 - 春之歌, 2015-05-15
- 俺笨又不爱动脑筋, 管那99个人坐哪儿呢, 我的座位要么空着, 要么被占, 我有一半的几率坐在自己票座位上. - 灶君, 2015-05-14