• 《编程之美》中的一道错题 4.1 金刚坐飞机


    4.1 金刚坐飞机问题 

        话说,这道题的解法和答案都是有问题的,我们只看原题:

        现在有一班飞机将要起飞,乘客们正准备按机票号码(1, 2, 3, N)依次排队登机。突然来了一只大猩猩(对,他叫金刚)。他也有飞机票,但是他插队第一个登上了飞机,然后随意地选了一个座位坐下了。根据社会的和谐程度,其他的乘客有两种反应:
        1.乘客们都义愤填膺,“既然金刚同志不遵守规定,为什么我要遵守?”他们也随意地找位置坐下,并且坚决不让座给其他乘客。
        2.乘客们虽然感到愤怒,但还是以“和谐”为重,如果自己的位置没有被占领,就赶紧坐下,如果自己的位置已经被别人(或者金刚同志)占了,就随机地选择另一个位置坐下,并开始闭目养神,不再挪动位置。
        那么,在这两种情况下,第i个乘客(除去金刚同志之外)坐到自己原机票位置的概率分别是多少?

        (一)先看第一问,我认为作者总结的公式太抽象了,至少能看懂那个公式的人不多。

        遇到这样的问题,就是枚举,猜出公式,然后数学归纳法。

        假设N=3,即1、2、3。 

            先来分析第一个人的概率:

            如果金刚占了1,概率1/3,那么第1个人永远没机会坐到自己座位,概率为0。

            如果金刚不占1(占了2或3)——概率2/3,这种情况下,第1个人可以在1和另一个座位(2或3)中进行选择,概率1/2,即P=2/3 * 1/2 = 1/3。

            合计:1/3——这是第一个人坐到自己座位的概率。

            再来分析第2个人的概率:

            果金刚占了2,概率1/3,那么第2个人永远没机会坐到自己座位,概率为0。

            如果金刚不占2(占了1或3),——概率2/3,这种情况下,我们要看第1个人,分2种情况:

    第1个人占2的概率为1/2(因为还剩2个位子),那么第2个人永远没机会坐到自己座位,即P=0

    第1个人不占2的概率也是1/2,那么最后一个位子肯定是2,概率为1。则P=2/3*1/2 * 1=1/3

    合计:1/3

            第3个人的概率就不要算了,因为没有位子了(N+1个人,N个位子,最后一个人肯定没位子)。

        综上,我猜测答案为1/N。

        其实我心里也没底,于是我让N=4,继续分析,但是这次,概率为0的事件我不再列出来了:

        第一个人的概率

            如果金刚不占1(占了2、3或4)——概率3/4,这种情况下,第1个人可以在剩下的3个座位中进行选择1,概率1/3,则P=3/4 * 1/3 = 1/4。

            合计:1/4——这是第一个人坐到自己座位的概率。

        第2个人的概率:

            如果金刚不占2(占了1、3或4),——概率3/4,这种情况下,我们要看第1个人在剩下的3个位置中不占2的概率:2/3。接下来第2个人占2的概率是1/2。则P=3/4 * 2/3 * 1/2 = 1/4

            合计:1/4

        第3个人的概率:

            如果金刚不占3(占了1、2或4),——概率3/4,这种情况下,我们要看第1个人在剩下的3个位置中不占3的概率:2/3。接下来第2个人在剩下的2个位置中不占3的概率是1/2,第3个人只剩下一个3可以选,概率为1。则P=3/4 * 2/3 * 1/2 * 1= 1/4

            合计:1/4

        观察得到结论:对于第i个人,我们先计算出金刚、以及第1个人、第2个人……第(i-1)个人——她们不占第i个位置的概率,分别是(N-1)/N、(N-2)/(N-1)、(N-3)/(N-2)直到(N-i)/(N-i+1),然后计算出第i个人在剩余的N-i个位子中占到第i个位子的概率,也就是1/(N-i),把以上这些概率相乘,乘积为1/N,这就是最后的结果。

        当然,当i=N的时候,概率永远为0,因为最后一名没有位子选了。

        也许我是数学系的,思考角度和科班出身的计算机系mm不太一样。

        (二)再看第2问:

    image

        话说,这个答案是错的。

        仍然按照刚才的思路进行枚举:

        最简单的情况,令N=2,就是说,只有2个元素:1和2。

            我们先看i=1的情形,也就是第一个乘客的概率

            如果金刚选择1坐下,那么第一个乘客永远没机会,为0。

            如果金刚选择2坐下,概率1/2,那么只剩下第一个位置为第一个乘客,P=1/2 * 1 = 1/2。

            合计:f(1) = 1/2。

            我们再看i=2的情形

            还是那句话,最后一个人概率永远为0。

        但是,按照作者给出的公式:这两个值分别是f(1)=2/3和f(2) = 1/2。

        所以,我猜测,这个公式应该是F(i) = f(i) = (N-i)/(N-i+1)。很奇怪邹欣为什么没写几个TestCase来试试。 

        心里还是没底,毕竟作者是微软的,于是我分别测试了N=3和N=4情况下,i为2和3的情形。

        比如说N=4,i=2

        我发现,当金刚占了第1个位置,那么,第1个人不占2的概率是2/3(因为还剩下3个数),此时第2个人肯定可以占2。f(i) = 2/3

        比如说N=5,i=3:

            当金刚占了第1个位置,那么,接下来分只考虑第一个人不占3的两种情况:

                第一个人占2的概率是1/4,那么第2个人不占3的概率是2/3,则第3个人肯定占3。

                第1个人不占2也不占3的概率是1/2,此时第2个人肯定占2,第3个人肯定占3。

            计:1/4 * 2/3 + 1/2 = 2/3

            当金刚占了第2个位置,那么,第一个人肯定占1,第2个人不占3的概率是2/3,此时第3个人肯定可以占3。

            合计2/3

        将N和i(这里i>n)推而广之:

        当金刚占了第n个位置,那么不计第n-1个人以前的乘客,因为他们肯定能做到自己的位置。那么现在,还有第n个乘客,以及剩下的N-n个乘客(从第n+1到第N个)。

        于是问题退化为:第n个乘客化身为金刚,剩下的(N-n)个乘客按顺序登机,新的金刚插队第一个登机,随意在第n+1到第N个这(N-n)个位置中坐下……

        退化题目所得到的结果F(n)和原题目的结果f(n)是一样的(这里要说清楚,一定要使用数学归纳法)。

        所以,我相信,经过若干次退化后,因为n<i<N,所以n会先逼近i,也就是说,这个极限是,金刚占了第i-1个位置,然后第i-1个人不占i的可能性是(N-i)/(N-i+1),这个就是我们要计算的f(i)。

        综上所述:f(i) = (N-i)/(N-i+1)。

        然后进行计算,得到F(n)=(N-i)/(N-i+1)。这才是正确答案。

  • 相关阅读:
    开源博客平台WordPress十岁啦!
    (转载)C# Attribute 用法备忘
    hibernate入门
    Hibernate对象关系映射基础
    struts2UI标签
    struts2文件上传2(多文件)
    struts2验证(手工)
    通过修改注册表改变txt文件的默认打开方式
    struts2验证(XML)
    Struts国际化
  • 原文地址:https://www.cnblogs.com/Jax/p/1611603.html
Copyright © 2020-2023  润新知