返回顶部
首页 > 资讯 > 后端开发 > Python >利用Python破解生日悖论问题
  • 152
分享到

利用Python破解生日悖论问题

Python破解生日悖论Python生日悖论 2022-12-08 20:12:01 152人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、前言二、生日悖论是什么三、公式破解四、随机数破解五、添加功能:dict储存及改变方式一、前言 别问我为啥题目是英文,因为…高大上(bushi。 刷视频的时候偶然

一、前言

别问我为啥题目是英文,因为…高大上(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生日悖论内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用Python破解生日悖论问题

本文链接: https://lsjlt.com/news/174496.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 利用Python破解生日悖论问题
    目录一、前言二、生日悖论是什么三、公式破解四、随机数破解五、添加功能:dict储存及改变方式一、前言 别问我为啥题目是英文,因为…高大上(bushi。 刷视频的时候偶然...
    99+
    2022-12-08
    Python破解生日悖论 Python 生日悖论
  • 利用Python破解摩斯密码
    目录摩尔斯电码Python实现摩斯密码对照表加密解密测试完整代码总结在电影《无间道》中,刘建明(刘德华饰)作为黑帮的卧底在一次行动中发现了警察的卧底陈永仁(梁朝伟饰)与黄警督(黄秋生...
    99+
    2024-04-02
  • 利用python的hook技术破解htt
        相对于http协议,http是的特点就是他的安全性,http协议的通信内容用普通的嗅探器可以捕捉到,但是https协议的内容嗅探到的是加密后的内容,对我们的利用价值不是很高,所以一些大的网站----涉及到“大米”的网站,采用的都是h...
    99+
    2023-01-31
    技术 python hook
  • PHP异常处理:利用异常日志分析生产问题
    php异常日志记录:通过自定义异常处理程序,可以将异常详细信息记录到日志文件中,包括异常类、错误信息和堆栈跟踪。利用这些日志,可以快速识别和解决数据库连接错误等生产问题,确保应用程序平稳...
    99+
    2024-05-14
    php 异常处理 mysql
  • 利用Python自动化生成爱豆日历详解
    目录1.科普2.爱豆日历3.总结本次内容有感于《Python编程快速上手-让繁琐工作自动化》。 根据书中的「处理Excel电子表格」章节内容,做出一份专属日历。 使用的模块为open...
    99+
    2024-04-02
  • java图论普利姆及克鲁斯卡算法解决最小生成树问题详解
    目录什么是最小生成树?普利姆算法 算法介绍应用 --> 修路问题 图解分析 克鲁斯卡尔算法算法介绍应用场景 -- 公交站问题 算法图解 算法分析 如何判断是否构成回路代码实现 ...
    99+
    2024-04-02
  • 利用Python破解验证码实例详解
    一、前言 本实验将通过一个简单的例子来讲解破解验证码的原理,将学习和实践以下知识点: Python基本知识 PIL模块的使用 二、实例详解 安装 pillow(PIL)库: ...
    99+
    2022-06-04
    验证码 详解 实例
  • 如何利用Python破解摩斯密码
    这篇文章将为大家详细讲解有关如何利用Python破解摩斯密码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。摩尔斯电码摩斯密码的定义如下:摩尔斯电码( 又译为摩斯密码,英语:Morse code)是一种时通...
    99+
    2023-06-29
  • 解决SpringBoot log4j日志没生成的问题
    SpringBoot log4j日志没生成 从同事那接了一个脚手架,启动后发现日志文件没生成。 都知道SpringBoot默认带的logback,如果要用log4j需要把logbac...
    99+
    2024-04-02
  • ​​​​​​​如何利用python破解zip加密文件
    目录前言:一、破解zip加密文件的思路二、实例代码演示0、zip的压缩方式1、解压zip文件2、实现密码字符的全排列三、密码是几位未知,也可以破解密码总结前言: 日常工作中,会遇到一...
    99+
    2024-04-02
  • 怎么利用python破解zip加密文件
    本篇内容主要讲解“怎么利用python破解zip加密文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么利用python破解zip加密文件”吧!一、破解zip加密文件的思路准备一个加密的zip...
    99+
    2023-06-30
  • 利用Python求解阿基米德分牛问题
    目录题目大意sympy求解结果题目大意 问 太阳神有一牛群,由白、黑、花、棕四种颜色的公、母牛组成,其间关系如下,求每种牛的个数。 公牛中,白牛多于棕牛,二者之差为黑牛的1...
    99+
    2023-03-09
    Python阿基米德分牛问题 Python阿基米德分牛
  • 利用Python实现自动生成数据日报
    目录前言需求详解数据处理前言 人生苦短,快学Python! 日报,是大部分打工人绕不过的难题。 对于管理者来说,日报是事前管理的最好抓手,可以了解团队的氛围和状态。可对于员工来说,那...
    99+
    2024-04-02
  • 利用python爬虫怎么破解加密字体
    本篇文章为大家展示了利用python爬虫怎么破解加密字体,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言...
    99+
    2023-06-06
  • 利用Python暴力破解邻居家WiFi密码
    如觉得博主文章写的不错或对你有所帮助的话,还望大家多多支持呀!关注、点赞、收藏、评论。 文章目录 一、编写代码二、展示测试结果三、测试四、生成密码本(建议自己找一个密码本) ...
    99+
    2023-08-31
    python 开发语言
  • 利用Python实现自动生成小学生计算题
    目录生成计算题写入Word中过年期间发现小外甥已经上小学了,我姐说老师今天给他们布置了寒假作业:每天坚持做乘法和加减法混合运算。 这我必须帮帮忙,用Python写了一段自动生成小学生...
    99+
    2023-02-07
    Python生成计算题 Python计算题
  • Python 文件操作的常见问题解答:破解文件处理难题
    ...
    99+
    2024-04-02
  • Python 概率生成问题案例详解
    概率生成问题 有一枚不均匀的硬币,要求产生均匀的概率分布 有一枚均匀的硬币,要求产生不均匀的概率分布,如 0.25 和 0.75 利用 Rand7() 实现 Rand10() ...
    99+
    2024-04-02
  • Java面试必问问题:如何利用Git记录日志?
    在开发过程中,记录日志是非常重要的一项工作。而Git是目前最流行的版本控制工具之一,它能够方便地记录每次代码变更的详细信息,包括代码修改的时间、修改的人员、修改的内容等。本文将介绍如何利用Git记录Java项目的日志信息。 一、Git的日...
    99+
    2023-08-07
    面试 日志 git
  • 用 Python 数据结构破解算法难题
    ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作