利用Python破解生日悖论问题
作者:?????? 发布时间:2022-11-08 02:37:55
一、前言
别问我为啥题目是英文,因为…高大上(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("请输入正确")#提示
代码解析还是看注释。
来源:https://blog.csdn.net/C_ygxb/article/details/128073651
猜你喜欢
- 在域环境下我没配置成果,也许是域用户的原因,因为我在生产环境下搞的,更改域用户需要重启SQLServer ,所以这个方法放弃了,只能用证书形
- Hello, 大家好,又是我~ 大家有看过font set和一些要注意的基本问题以及通用字体族两篇文章后,应该对字体的基本有了一些了解。现
- 一、问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统
- 阅读上一篇:FrontPage2002简明教程三:网页布局 网页的强大之处就在它的超链接,在浏览器中通过点击网页中的超链接,可以很方便地打开
- php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一
- 在风起云涌的互联网浪潮中,产品迭代的速度越来越快。随着用户需求的激增,也不断带来了对设计师能力要求的提高。初入交互设计领域几年来,明显发现可
- 前言一般的反爬措施是在多次请求之间增加随机的间隔时间,即设置一定的延时。但如果请求后存在缓存,就可以省略设置延迟,这样一定程度地缩短了爬虫程
- 1.由于设置了slave的配置信息,mysql在数据库data目录下生成master.info,所以如有要修改相关slave的配置要先删除该
- 相比SQL Server 2000提供的FOR XML查询,SQL Server 2005版本对现有功能增强的基础上增加了不少新功能,最为吸
- scrapy框架概述:Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数
- 1.双击setup.exe.(出现安装向导界面) 2.在安装向导界面:选"基本安装",并选好主目录位置;创建启动数据库(
- $server->connections//server−>connections遍历所有websocket连接用户的fd,给所
- 本文实例讲述了PHP解析xml格式数据工具类。分享给大家供大家参考,具体如下:class ome_xml { /**  
- 1. 首先到 nodejs.org 下载 Node.js 安装包并安装。2. 打开 Sublime Text 2 编辑器。选择菜单 Tool
- 一:修改文件上传语言为PHP 打开fckconfig.js 找到: var _FileBrowserLanguage = 'asp&
- 1. 简介本文将介绍 Go 语言中的 sync.Cond 并发原语,包括 sync.Cond的基本使用方法、实现原理、使用注意事项以及常见的
- 在这篇文章中,将向您展示如何使用Python链接目前主流的MongoDB(V3.4.0)数据库,主要使用PyMongo(v3.4.0)和Mo
- 1、把这段拷到DW里,存成HTML文件。<HTML><HEAD><TITLE>move backgrou
- 每次在"万达影城"网上购票总会用到左上角选择城市的功能。如下:今天就在ASP.NET MVC中实现一下。我想最好的方式应
- 字体的处理在网页设计中无论怎么强调也不为过, 毕竟网页使用来传递信息的, 而最经典最直接的信息传递方式就是文字,&nbs