生日悖论(java算给你看)

参考https://baijiahao.baidu.com/s?id=1597553921951487941&wfr=spider&for=pc

生日悖论的原题是,一个房间里有多少人才能保证其中至少两个人的生日是同一天的概率超过50%。

       按我们的理所当然的想法是,这种概率非常低,但是实际上只需要23人就能达到这种概率。这种现象就是生日悖论,造成这种现象的根本原因其实就是我们在想像中通常拿自己做标准,与自己同一天的概率非常低,但是实际题目是指任一天。

 

分析:

当人数为2时,

       正常情况下指定生日是某一天的时候,两人生日为这一天的概率为1/365*1/365,但是到了随便某一天的时候,生日的可能就有365种了,这样,两人生日是同一天的概率就变成了1/365*1/365*365=1/365。而两人生日不相同的概率为1/365*364/365*365=364/365。

当人数为3时,

       其它条件与2人时一致,至少两人生日为同一天的概率为

1:3人中两两组合=3种组合

2:3人生日为同一天

最后得出3人中至少两人生日为同一天的概率为1/365*1/365*364/365*365*3+1/365*1/365*1/365*365=(364*3+1)/365*365

算两人相同的概率情况很多比较复杂,而3人生日都不相同的概率就比较简单1/365*364/365*363/365*365=364*363/365*365

所以还是以计算不相同概率为主从而得出相同的概率来的好

当人数为4的时候

       设不相同的概率人数为1时为P1=1/365*365,人数为2时为P2=364/365,人数为3时为P3=364*363/365*365

P3=P2*(365-人数+1)/365

同理P4 = P3*(365-4+1)/365

验证一下P4 = 1/365*364/365*363/365*362/365*365=364*363*362/365*365*365 = P3*(365-4+1)/365

结论,N个人不相同的概率为PN= P(N-1)*(365-N+1)/365

java代码:

import java.math.BigDecimal;

public class BirthdayParadox {

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

            double rate = 100;
            int sum_people = birth_paradox(sum_day,rate);

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

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

            //初始概率
            BigDecimal Pb = new BigDecimal(1);

            /**
             * 从第sum_people=1个人开始找起,看其两两生日不等时,事件概率是否成立。
             * 如果不成立,则sum_people+1。
             */
            for (sum_people = 1;sum_people<=sum_day+1;sum_people++){
                //得出当前不相同的概率
                double Pa = ((sum_day)-sum_people+1)/sum_day;
                //Pb = Pb * Pa;
                Pb = Pb.multiply(new BigDecimal(Pa)).setScale(200,BigDecimal.ROUND_HALF_UP);
                System.out.println("人数:"+ sum_people+ "概率:" + Pb);
                //bigdecimal之间的减法,得出的是相同的概率
                BigDecimal subtract = new BigDecimal(1).subtract(Pb);
                //bigdecimal之间的比较用compareTo 如果>=0说明 数1>=数2
                if (subtract.compareTo(new BigDecimal(rate/100))>=0){
                    return sum_people;
                }
                if(sum_people >= 1000){
                    //防止代码出问题而做出的限制,此处可删
                    break;
                }
            }

            return sum_people;
        }
}

上述代码中使用的是bigdecimal而且不是double,因为如果用double的话,在计算50%概率的时候没影响,但是如果算到100%的概率的话就会出错,得出的结果是153人,而且提高double的小数位数,最多也只能得出200多人的结论,而到达100%的概率的结论很明显是366人。所以改用bigdecimal

 

这种悖论的运用看似不多,但是都是非常主要的地方,如果参考资料中说的生物识别率的认假率以及拒真率,甚至在出现

DNA 鉴定的陷阱

引用资料:

在信息安全的教科书中,必定会有一部分是关于“生日悖论”理论的。我想这应该包含了两重用意。首先,对于将要从事信息安全工作的人来说,“生日悖论”是他们必须要理解的一种现实现象。

其次,是要告诫学习者,即使是日常工作中经常接触数学的研究者,在准确把握概率上,也很难做到万无一失。“生日悖论”现象告诉我们,仅凭自己的直觉估算概率是不可取的,运用数学知识认真计算非常重要。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值