用python整个活(3)——生日悖论:birthday paradox

article/2025/8/28 0:09:14

🏆一、前言

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

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

诶,怎么是真的?

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

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

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


🏆二、生日悖论是什么

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

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

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

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

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

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

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

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


🏆三、公式破解

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

公式:d8a9f406b8f745b09cd97822296b6dd2.png

 

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小于100raise(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("请输入正确")#提示

代码解析还是看注释。

🏆六、尾声

诶嘿,成功海了一篇文章。

本来还想用C++写的,但是基础知识都忘光了。十分的乌鱼。

下一篇文章预告:下一篇文章详解(4)要对异常捕获,作用域,类,自定义模块进行详解,写作不易,支持一下~

其实这篇文章28日都写好了,不过想放到下一个月凑数量。

新的一周继续努力耶耶耶!

散会!

---------------------------------------------------------------end-------------------------------------------------------------

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/iiAmYxBq.shtml

相关文章

【算法导论】生日悖论

生日悖论问题&#xff1a; 不考虑出生年份&#xff0c;问&#xff1a;一个房间中至少多少人&#xff0c;才能使其中两个人生日相同的概率达到50%? 解&#xff1a; 假设一年有 n 天&#xff0c;屋子中有 k 人&#xff0c;用整数 1, 2, …, k 对这些人进行编号。假定每个人的生日…

反直觉的「生日悖论」问题

点击蓝色“五分钟学算法”关注我哟 加个“星标”&#xff0c;一起学算法 作者 | labuladong 来源 | labuladong 生日悖论是由这样一个问题引出的&#xff1a;一个屋子里需要有多少人&#xff0c;才能使得存在至少两个人生日是同一天的概率达到 50%&#xff1f; 给你 5 秒钟随便…

浏览器不能展开全部内容/界面(展开更多点击无效果)

win10浏览器不能展开全部界面 1、按下“WinR”组合键&#xff0c;在框中输入“inetcpl.cpl”&#xff0c;点击确定打开“internet 选项”; 2、点击“高级”选卡&#xff0c;点击底部的“重置”按钮; 3、在“重置 Internet Explorer 设置”界面将“删除个人设置”选项勾选&…

CSDN文章自动展开全文无需登录插件(仅限Chrome)!

为什么80%的码农都做不了架构师&#xff1f;>>> 众所周知csdn里所有blog都记录了程序员们多年的技术积累&#xff0c;他们不吝啬技术&#xff0c;免费分享经验&#xff0c;随着资料的丰富&#xff0c;那些踩过的坑&#xff0c;报过的错&#xff0c;全被前人当成树种…

VSCode 代码块/全文 折叠/展开 快捷键

需求 && 操作 常用的两类场景(注意要操作的范围)&#xff1a; 要操作光标所在文件中的所有代码块&#xff1a; 折叠所有 CtrlK0展开所有 CtrlKJ 仅仅操作光标所处代码块内的代码&#xff1a; 折叠 CtrlShift[展开 CtrlShift] 更多操作 如果你有更多需求的话&#…

列表页面的展开以及收起

列表页面的展开以及收起 需求想法关键代码结尾 需求 由于公司新需求 &#xff0c;写一个列表页 &#xff0c;不上拉加载 &#xff0c;点击加载更多去加载 还会有收起按钮 。大概效果如下图所示&#xff1a; 想法 1&#xff0c;一开始想的是直接对数组进行切割 。然后每次点…

CSDN自动展开全文的插件

程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 1 分钟。 这个插件的名字叫&#xff1a;CsdnAutomaticallyOpen&#xff0c;今天刚撸的&#xff0c;下午有点时间再逛CSDN&#xff0c;每篇都要点击阅读全文&#xff0c;尤其是有的还要关注&#xff0c;受…

iOS使用YYLabel 点击展开和收起全文

看图说话比较清晰&#xff0c;点击红色标记的区域&#xff0c;会展开全文。 相关知识点 YYLabel&#xff0c;truncationTokenNSAttributedString&#xff0c;YYText&#xff0c;YYTextHighlight 我们来看一下YYLabel的属性truncationToken&#xff0c;是一个富文本&#xff0…

java爬取新浪微博带有“展开全文”的完整微博文本

获取新浪微博“展开全文”的完整文本 在个人主页的响应中&#xff0c;这篇微博的表示形式是这样的&#xff1a; <div class\"WB_text W_f14\" node-type\"feed_list_content\" nick-name\"Vista看天下\">\n 【一堂课…

uni-app,一段文字实现展开、收起全文点点点

效果&#xff1a; 思路&#xff1a; 1.根据文本显示的布局中&#xff0c;每行大致能显示的文字个数。&#xff08;实例是大致每行26个文字&#xff09; 2.首先加载页面时&#xff0c;根据文字总长度判断是否超出自定义行数&#xff0c;来处理相应的数据&#xff0c;多余自定义…

CSDN阅读全文自动展开插件,安排上!

TJ平时经常利用一些碎片时间逛逛CSDN&#xff0c;由于是碎片时间&#xff0c;往往都是看到哪是哪&#xff0c;所以也没有登录&#xff0c;于是会碰到一个情况&#xff0c;就是看到一篇文章觉得不错&#xff0c;刚看了两句就让点击展开全文&#xff0c;点击之后还要求登录才行&a…

uni-app中,文字超出隐藏并显示省略号(实现展开、收起全文)

一、uni-app中&#xff0c;固定宽高&#xff0c;文字超出部分&#xff0c;隐藏并显示省略号。 .topic_cont_text{padding: 30upx;colof: #999;background: #E1FFFF;max-height: 130upx;overflow: hidden;word-break: break-all; /* break-all(允许在单词内换行。) */text-ov…

iOS文本展开收起,使用YYKit展开全文和收起全文,支持图文混排

使用YYKit展开全文和收起全文&#xff0c;支持图文混排 使用简单 1.依赖库&#xff1a; 该工具是基于YYKit封装的工具类&#xff0c; 使用前先用cocoapods导入依赖库&#xff1a;pod ‘YYKit’ 2.使用方法 导入头文件 #import “YYLabel_gcz.h” 初始化和赋值内容 YYLabel…

前端页面 div+css内容太长,实现点击展开余下全文(修改版)

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>文章高度展开</title> <style> .content{padding:10px 12px 48px;font-size:18px;color:#2b2b2b;line-height:1.7em;height:300px; /*初…

[javascript] 实现展开全文和收起全文效果

在展示大量文本的时候,很多网站会在页面上出现一个展开全文的文字按钮 , 点击这个按钮才会展开全部内容 . 使用jquery比较容易实现 , 最开始我想直接根据vuejs的语法来实现效果 , 结果失败 , 还是jq做起来简单 思路是 , 获取当前文本的div高度 ,超过一定高度就增加一个class值 …

uni-app,文本实现展开、收起全文

效果: 思路&#xff1a; 1.根据文本显示的布局中&#xff0c;每行大致能显示的文字个数。&#xff08;实例是大致每行26个文字&#xff09; 2.首先加载页面时&#xff0c;根据文字总长度判断是否超出自定义行数&#xff0c;来处理相应的数据&#xff0c;多余自定义行数&#…

[HTML+CSS+Vue.js] 超长文本等内容默认折叠显示,点击展开全文,再点击收起(仿知乎效果)

今天在做一个仿博客主页&#xff0c;日记的部分想做成折叠展开的效果&#xff0c;这样比较有利于浏览和交互&#xff0c;然后想起知乎问答的页面效果&#xff0c;就很符合我想要的样式&#xff1a; 因为之前没做过&#xff0c;不知从何下手&#xff0c;在网上查了大半天&#…

vue 展开全文,收起全文

样式效果 1.展开全文 2.收起全文 html <div class"content_box"><div class"cont_top"><div class"bluebox"></div><span>详情描述</span><span class"divider"></span></div&g…

html如何制作展开全文,如何实现文章内容页点击“展开阅读全文”的功能

我们在手机端看CSDN或知乎上的文章时&#xff0c;都会有一个点击展开阅读全文的按钮。这个功能效果使用还是很广泛的&#xff0c;网上也有很多这样的jq插件可以实现&#xff0c;今天小郭给大家分享一下自己在项目中常用到的js点击展开阅读全文的代码。 如下图&#xff1a; 完整…

令人头疼的“展开原文”,请收好这款神器!

互联网时代下&#xff0c;网上阅读资讯也早已成为用户习惯。 但近几年&#xff0c;随着互联网的发展&#xff0c;一个令人头疼的现象出现了&#xff0c;即网上越来越多文章&#xff0c;都需要点击一次&#xff0c;才能查看全文了&#xff0c;就像下面这样子…… 尤其对于网站的…