算法问题——生日悖论

问题:

一个屋子里人数必须要达到多少人,才能使其中两人生日相同的机会达到50%?

为了回答这个问题,设:

1、设k是屋子里的总人数,对每一个人进行编号,则编号为1,2,3···k

2、设所有年份都是365天,最大天数n=365

3、bi表示第i个人的生日天数,所以1<=bi<=360,1<=i<=k

public class Main {
    /**
     * 第i个人的生日正好在“第r天的概率”为:
     *
     * P{bi=r} = 1/n
     */

    /**
     * 第i个人和第j个人的生日,“都落在第r天的概率”为:
     *
     * P{bi=r且bj=r} = P{bi=r}*P{bj=r} = (1/n)^2
     */

    /**
     * 第i个人和第j个人的生日,“都落在同一天的概率”为?
     * 此处的落在同一天并没有指定落在那一天,所以可以都是第1天或者都是第二天或者·····
     *
     * P{bi=bj}
     * = P{bi=1}*P{bj=1} + P{bi=2}*P{bj=2}+···+P{bi=n}*P{bj=n}
     * = (1/n)^2 + (1/n)^2 + ···+ (1/n)^2
     * = 1/n
     */

    /**
     * 原问题是:找到“至少有两个人生日相等”
     * 换句话说就是:1减去所有人生日都互不相同的概率。
     * 所以接下来就要找到“所有人生日都互不相同的概率”
     *
     * 设:
     * 1、有k个人,这k个人生日都互不相同的事件为:Bk
     * 2、那么k个人生日都互不相同的事件的概率就为:P{Bk}
     * 3、有一个人i,有多个人1-j,其中j<i(也就是说那多个人的编号从1到j,且j编号还小于i编号)
     *      则这个第i个人和1-j个人的生日不相同的事件为:Ai
     *      (即:i与1的生日不同,且i与2的生日不同···且i与j的生日不同。
     *       注意:此处1-j个人之间生日是否不同并没有做强制规定)
     * 4、这个第i个人和1-j个人的生日不相同的事件的概率为P{Ai}
     *
     * 由此我们就可推出:
     * Bk = A1 * A2 * A3 *···* Ak
     * 因为:
     * Bk指的是k个人中,“两两”生日不等的事件。
     * A1指的是,1个人时,“两两”生日不等的事件。
     * A2指的是,第2个人和第1个人生日不等的事件。
     * A3指的是,第3个人和第1个人生日不等、且第3个人和第2个人生日不等。
     * A4指的是,第4个人和第1个人生日不等、且第4个人和第2个人生日不等。第4个人和第3个人生日不等。
     * ·····
     * 所以A1到Ak所有事件都发生的情况下,就是Bk这个事件。
     *
     * 转换成概率就是:
     * P{Bk} = P{A1} * P{A2} * P{A3} *···* P{Ak}
     *
     * 此时我们再从另一种角度想一下这个问题,
     * B(k-1)指的是(k-1)个人中,“两两”生日不等的事件。
     * 这B(k-1)事件意味着第1个人到第(k-1)个人的生日“已经互不相等了”,
     * 此时如果我们要“加上第k个人”,且“还是要他们所有人生日互不相等(即达到事件Bk)”,
     * 则只需要满足“第k个人的生日与第1人生日不同、且与第2人生日不同···且与第(k-1)人生日不同”这个事件即可。
     * (即只需要满足第k与第1到第k-1不同,而B(k-1)表示“第1到第k-1”已经两两互不相同了)
     * 转换成公式则为:
     * Bk = B(k-1) * Ak
     *
     * 由上一个思考角度继续思考,
     * 根据这个公式:Bk = B(k-1) * Ak,可知:
     * 这(k-1)个人各有各的生日,且互不重复,也就是说,一年365天里,他们的生日占了其中的(k-1)天。
     * Ak事件如果要达成,则第k个人的生日“不能是这(k-1)天中的任意一天”。
     * 那么Ak事件(即第k人生日与这(k-1)人生日都不相等)的概率就是:(n-(k-1))/n,(k的生日必须是这(k-1)天以外的某一天)。
     * 即:P{Ak} = (n-(k-1))/n
     *
     * 综上所述,我们能得到以下公式:
     * P{Bk}
     * = P{B(k-1)} * P{Ak}
     * = P{B(k-2)} * P{A(k-1)} * P{Ak}
     * = P{B(k-3)} * P{A(k-2)} * P{A(k-1)} * P{Ak}
     * ·····
     * = P{A1} * P{A2} * P{A3} *···*  P{A(k-1)} * P{Ak}
     * = 1 * ((n-(1))/n) * ((n-(2))/n) *···* ((n-(k-2))/n) * ((n-(k-1))/n)
     * = 1 * (1-(1/n)) * (1-(2/n)) *···* (1-((k-2)/n)) * ((1-((k-1)/n))
     */

    /**
     *
     * 由原题“生日相同的机会达到50%”,
     * 所以:1-P{Bk} >=50%,即:P{Bk} <= 1/2
     *
     * 下面就是使用一些数学知识求解了:
     * 根据不等式:1+x<=e^x ,将“-((k-1)/n)”看成不等式中的x,得:
     * P{Bk} <= e^(-(1/n)) *···* e^(-((k-1)/n))
     * P{Bk} <= e^((-k*(k-1))/2n)
     * e^((-k*(k-1))/2n) <= 1/2     (原题目要求)
     *
     * 将n=365时,
     * 解得:k>=23
     * 所以,一个屋子里人数必须要达到23人,才能使其中两人生日相同的机会达到50%
     */

    public static void main(String[] arg){
        int sum_day = 365;

        int sum_people = birth_paradox(sum_day);

        System.out.println("当一年有"+sum_day+"天时");
        System.out.println("一个屋子里人数必须要达到"+sum_people+"人,才能使其中两人生日相同的机会达到50%");
    }

    /**
     * 当一年有sum_day天时,
     * 一个屋子里人数必须要达到多少人,才能使其中两人生日相同的机会达到50%
     * @param sum_day 一年的总天数
     * @return 至少得有多少人,才能达到要求
     */
    public static int birth_paradox(double sum_day){
        //所需总人数
        int sum_people;

        //初始为P{A1}=1
        double Pb = 1;

        /**
         * 从第sum_people=1个人开始找起,看其两两生日不等时,事件概率是否成立。
         * 如果不成立,则sum_people+1。
         */
        for (sum_people = 1;sum_people<=sum_day+1;sum_people++){
            //P{Ak}
            double Pa = ((sum_day)-sum_people+1)/sum_day;

            //P{Bk} = P{B(k-1)} * P{Ak}
            Pb = Pb*Pa;

            //如果1-P{Bk} >=50%
            if ((1-Pb)>= 0.5){
                return sum_people;
            }
        }

        return sum_people;
    }
}
时间: 2024-08-10 09:08:17

算法问题——生日悖论的相关文章

密码学经典之生日悖论与生日攻击【详解】

生日悖论 在算法导论书上看到个比较有意思的概率算法,在这里加上自己的理解分享下: 上次刚看同学发的朋友圈说道:“两个人同一间宿舍,而且同年同月同日生,这个缘分真的是醉了”,当时我也是醉醉的,看了这个算法后才发现,屋里有23个人,那么就可以50%的概率生日是一样的. 是这样子证明的: 首先,假设屋子里有K个人,分别对他们编号1,2,3….k号.不考虑闰年的情况,那么一年就有n=365天,首先还是要假设生日是均匀分布在一年的n天中(喜欢在春天生就都在春天生这就不均匀了),然后还要假设两个人生日相互独

生日悖论

假设你参加一个舞会,舞池里有30个人,请问是其中某两个人有相同的生日可能性更大呢?还是没有哪两个人有相同生日的可能性更大? 这就是所谓的生日悖论,直觉上我们会觉得一年有365天,如果只有30个人,那么存在两个人同一天生日的可能性应该很低.但是与直觉上的认识相违背的是,通过严密的数学推导可以证明这个可能性其实相当高.特别地,对于60或者更多的人,这种概率甚至要大于99%. 假设每个人的生日是一年365天中随机的一天,每个人都是独立且均匀地随机选取的,在这个假定下,可以建立分析该问题的数学模型.注意

有趣的概率算法--生日悖论

在算法导论书上看到个比较有意思的概率算法,在这里加上自己的理解分享下: 上次刚看同学发的朋友圈说道:“两个人同一间宿舍,而且同年同月同日生,这个缘分真的是醉了”,当时我也是醉醉的,看了这个算法后才发现,屋里有23个人,那么就可以50%的概率生日是一样的. 是这样子证明的: 首先,假设屋子里有K个人,分别对他们编号1,2,3….k号.不考虑闰年的情况,那么一年就有n=365天,首先还是要假设生日是均匀分布在一年的n天中(喜欢在春天生就都在春天生这就不均匀了),然后还要假设两个人生日相互独立(什么双

Birthday Paradox lightoj 1104 生日悖论(概率)

Description Sometimes some mathematical results are hard to believe. One of the common problems is the birthday paradox. Suppose you are in a party where there are 23 people including you. What is the probability that at least two people in the party

LightOj 1104 - Birthday Paradox(生日悖论概率)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1104 题意:一年365天,在有23个人的情况下,这23个人中有两个人生日相同的概率是大于 0.5 的: 现在在不同的星球上一年有n天,求出x,至少有 x 个人才能使得这 x 人中有两个人的生日相同的概率是>=0.5的:现在除了自己之外还要 x 个人,求x: 我们按 n = 365 算的话,那么有x个人,这些人生日都不相同的概率是 p = 1 * 364/365 * 363/365 *

Light OJ 1104 Birthday Pardo(生日悖论)

ime Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Description Sometimes some mathematical results are hard to believe. One of the common problems is the birthday paradox. Suppose you are in a party where there are 23 people in

Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要把询问范围加到 \(10^{18}\) ,再多组询问呢? Miller 和 Rabin 建立了Miller-Rabin 质数测试算法. \(\\\) Fermat 测试 首先我们知道费马小定理: \[ a^{p-1}\equiv 1\pmod p \] 当且仅当 \(p\) 为素数时成立. 逆命题是

大数质因解:浅谈Miller-Rabin和Pollard-Rho算法

2017-07-19 08:54 Amphetamine:能发一下代码吗? 应我那位谜一样好友的邀约,我打算好好看一看Miller-Rabin和Pollard-Rho算法.很奇怪,各种地方有很多代码描述详细过程,但我仍旧很懵.也许是我太弱了,不能从那些“鱼龙混杂”的代码中找出本质上的共性.那么,我们现在来讨论一下吧. 首先,大整数分解现在仍然是个世界级的难题,在“公共密钥”的研究上有着重要的作用. !!先判断质数!! 试除法:原始的根号算法 额.不想说了.正经一点. Miller-Rabin:判

中科院随机算法课程(孙晓明主讲)topic list

如题,列出<随机算法>课程的topic list,以记录和供有兴趣的朋友研究. Lession1:生日悖论.生日攻击.两个常用数学工具(马尔科夫不等式.切比雪夫不等式) Lession2:radom quick sort(hw).矩阵乘法判定.min(max())=max(min()).复杂性类(BPP/RP/CORP/ZPP) Lession3:证明BPP2/3=BPP0.99.ZPP<=RP^CORP.Game Tree Lession4:Balls and Bins Lession