利用Python破解生日悖论问题

 更新时间:2022年12月07日 15:20:09   作者:¿¿¿¡¡¡  
生日悖论,就是23个人在一个房间,期间必然有两个人生日相同的概率为50%,30个人的话概率是70%,60个人甚至上升到99%。本文就来用Python语言破解这一问题,感兴趣的可以了解一下

一、前言

别问我为啥题目是英文,因为…高大上(bushi。

刷视频的时候偶然刷到了一个关于生日悖论的,当场就觉得不可思议,直到上网查了查……

诶,怎么是真的?

这玩意儿居然还被设置到了密码攻击学,就很离谱的。

密码攻击我倒是没那个肝,就…检验一下这个悖论的合理性吧。

本文将会对生日悖论进行详细的讲解,写作不易,支持一下!(万年不变客套话)

二、生日悖论是什么

可能有很多人不了解这个悖论,让我们先了解一下。

生日悖论,就是23个人在一个房间,期间必然有两个人生日相同的概率为50%,30个人的话概率是70%,60个人甚至上升到99%。

这本来不应该是悖论,但是让人感觉十分不合理,违反直觉,故此叫做悖论。

大家肯定会问:一共就23个人,不应该是23/365的几率吗?怎么可能呢?

其实,是因为…好吧我也不知道,要是一个小学生都知道这就不叫悖论了。

反正这种想法肯定是错误的,百度上说因为是随机的23个人,大脑不擅长处理非线性函数,其实23个人就有很多种组合。

我们换一种想法。假设有23个人,那么如果想让生日不相同,第一个人就可以是365天的任意一个就是365/365,而第二个人就必须是其他364个就是364/365,最后到了第23个人就是343/365。

最后我们把这些概率一乘,1一减,才是真正的概率。

三、公式破解

和上面说的想法一样,我们可以用公式去破解这个悖论。

公式:

p为生日相同的概率,用1减去就是生日不相同的概率,这个我们是可以求的,如上所述。

思路:用上面的公式代入进去,先求分母相乘的结果,幂运算就行。

之后求分子相乘结果,for循环递减人数,结果相乘,结束。

之后用分子除以分母得到概率,用1一减,结果保留三位小数,加百分号,初始化变量之后再次检测。

he=1#初始化变量
he2=1#初始化变量
while 1:#死循环
    try:#错误捕捉
        people=int(input())#获取人数
    except:#如果发生错误
        print("请输入正确")#提示错误
    else:#如果没有发生错误
        he=365**people#计算下面的所有365相乘,幂运算
        jian=365#初始化递减的变量
        for xh in range(people):#for循环递减
            he2=he2*jian#计算
            jian-=1#jian自减,模拟公式分子的递减
        print(round((1-he2/he),3),"%")#输出保留三位小数后的结果
        he2=1#初始化变量

这就是公式破解的方法。

注释已经放上去了,自己看。

四、随机数破解

这种破解方法就是随机生成输入的人数,检测他们的生日是否相同。

思路:首先创建一个函数,封装产生随机数和检测是否有重合项的代码。

之后死循环,获取人数信息并且进行多次实验取平均值,输出概率。

比较列表的每一项是否相同,还用上for循环,肝了半个小时,突然想到集合可以去重,比较前后长度是否有改变就行了…

import random as r#导入随机数模块且命名r
birthday=[]#保存不同生日的列表
shuliang=0#初始化变量
def jiancha():#创建函数来新建生日和检查是否重合
    global shuliang,birthday#全局两个变量
    for xh in range(people):#循环人数次
        birthday.append(r.randint(1,365))#添加随机数生日
    if len(birthday)!=len(set(birthday)):#集合去重后与之前长度不一样就是有重合项
        shuliang+=1#数量加一
    birthday.clear()#清空列表birthday
while True:#死循环
    try:#异常捕获
        people=int(input())#获取人数
        for xh2 in range(1000):#进行1000次检测求平均值
            jiancha()#调用函数
        print(shuliang/1000)#求平均值
        shuliang=0#初始化变量
    except:#如果发生错误
        print("请输入正确的数字")#提示

注释也放上去了自己看。

五、添加功能:dict储存及改变方式

接下来,我们添加一个功能:用dict储存不同人数时的概率,并且先用字典保存所有再在字典里查找人数。

我们要用到字典方法:setdefault。再回顾一下详解2:

用法:返回括号里键的值,如果没有这个键就在字典里添加这个键,值为None,如果又填了一个值就是要添加的值。

还有get,也是输出对应的值,没有则返回第三个值。

听不懂?看就完了!

import random as r#导入随机数模块且命名r
birthday=[]#保存不同生日的列表
zidian={}#保存人数和概率的字典
shuliang,find=0,0#初始化变量
def jiancha():#创建函数来新建生日和检查是否重合
    global shuliang,birthday#全局两个变量
    for xh in range(people):#循环人数次
        birthday.append(r.randint(1,365))#添加随机数生日
    if len(birthday)!=len(set(birthday)):#如果有重合项
        shuliang+=1#数量加一
    birthday.clear()#清空列表birthday
while find<100:#大于等于100才退出循环
    try:#异常捕获
        find=int(input("要进行多少次检测?数量越高准确度越高但是时间会变长,至少100次否则程序会出错"))#获取次数
        if find<100:#如果find小于100
            raise(ValueError)#抛出异常
    except:#如果异常
        print("请正确输入,查看自己输入格式是否正确及数值是否大于99")#提示
for people in range(1,366):#每一个人数
    for xh2 in range(find):#进行find次检测求平均值
        jiancha()#调用函数
    if people%20==0:#如果可以被20整除
        print("等待进度:",round(people/365*find,2),"%")#安慰进度条
    zidian.setdefault(people,str(shuliang)+"%")#字典添加人数和概率
    shuliang=0#初始化变量
zidian2=str(zidian)#zidian2为zidian的字符串形式
while True:#死循环
    try:#异常捕获
        cha=int(input("请输入房间有多少个人,输出全部请输入114514"))#询问人数或者全部输出
        if cha==114514:#如果选择全部输出
            print(zidian2[1:-1])#截取字符串来去大括号
            print("冒号前面是人数,冒号后面是概率")#提示语
        else:#如果选择截取
            print(zidian.get(cha,"请输入1到365位"))#输出对应的value,如果没有则提示范围
    except:#如果错误
        print("请输入正确")#提示

代码解析还是看注释。

到此这篇关于利用Python破解生日悖论问题的文章就介绍到这了,更多相关Python生日悖论内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中schedule扩展的具体使用

    Python中schedule扩展的具体使用

    Python的schedule模块是一个轻量级的Python库,用于在指定时间执行某些操作,本文就来介绍一下Python中schedule扩展的具体使用,感兴趣的可以了解一下
    2024-12-12
  • 如何使用Python控制摄像头录制视频

    如何使用Python控制摄像头录制视频

    这篇文章主要介绍了如何使用Python控制摄像头录制视频,实现过程需要用到三个库tkinter库、PIL库、cv2库,下面将内容详细的一步一步实现,希望对你有所启发并能做一个属于自己的摄像头控制程序
    2022-03-03
  • Python3爬虫之自动查询天气并实现语音播报

    Python3爬虫之自动查询天气并实现语音播报

    这篇文章主要介绍了Python3爬虫之自动查询天气并实现语音播报,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Python读取pdf、word、excel、ppt、csv和txt文件提取所有文本

    Python读取pdf、word、excel、ppt、csv和txt文件提取所有文本

    这篇文章主要给大家介绍了关于Python读取pdf、word、excel、ppt、csv和txt文件提取所有文本的相关资料,文中通过代码示例将实现的方法介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • python PaddleSpeech实现婴儿啼哭识别

    python PaddleSpeech实现婴儿啼哭识别

    这篇文章主要为大家介绍了python PaddleSpeech实现婴儿啼哭识别操作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Python实现语音识别和语音合成功能

    Python实现语音识别和语音合成功能

    声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移。这篇文章主要介绍了Python实现语音识别和语音合成,需要的朋友可以参考下
    2019-09-09
  • 神经网络算法RNN实现时间序列预测

    神经网络算法RNN实现时间序列预测

    这篇文章主要为大家介绍了神经网络算法RNN实现时间序列预测示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • python 下载文件的几种方式分享

    python 下载文件的几种方式分享

    这篇文章主要介绍了python 下载文件的几种方式分享,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • 68行Python代码实现带难度升级的贪吃蛇

    68行Python代码实现带难度升级的贪吃蛇

    本文主要介绍了Python代码实现带难度升级的贪吃蛇,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 《Python学习手册》学习总结

    《Python学习手册》学习总结

    本篇文章是读者朋友在学习了《Python学习手册》这本书以后,总结出的学习心得,值得大家参考学习。
    2018-01-01

最新评论