概述
Python不用学,看看你就懂;拿来就能用,用用你就会
无需安装编程软件,把代码拷贝到在线编辑器即可运行
同学们常常被数学老师的某些违反直观感受的数字给吓着了,比如这个:
“如果你们班有23个同学,那么至少有两个同学生日相同的概率大约是50%;如果你们班有50个同学,那么至少有两个同学生日相同的概率是97%。”
换句话说,如果你们学校很大,比如有100个班,每个班50个学生的话,那么很可能大概有97个左右的班都有生日重复的同学。如果你凭直观感觉跟数学老师打赌说你认为不超过比如30个班有生日重复,或者保险一点赌不超过90个班,那么你基本上输定了。
好了,这个数学公式其实很简单,就是先计算班上所有人生日都不重复的概率,然后用1减掉就可以了:
不过这个式子,一般的计算器并搞不定,里面的数字实在太大了。就算是Google计算器,阶乘大概最多可以算到170!,你可以试一下365!,结果是这样的:
这个时候,Python超级计算的优势又体现出来了,既简单又强大,一句话搞定,而计算毫无压力:
Pn = 1 - factorial(365) / (365**n * factorial(365-n))
计算结果:
P(23) = 0.5072972343239854
P(50) = 0.9703735795779884
完美!数学老师又赢了!
可能你还不服输,想真实地看一下,直观地感受一下。那么你除了到学校校务处去验证一下之外,还有一个方法,就是用Python模拟实验咯。
我们的代码包括了上述的理论计算以及相应的模拟实验如下(代码中有一个关键的函数set( ),叫集合函数,这里借以去掉一个列表中的重复项,以后再细讲):
import random
from math import *
n = int(input("请输入一个班有多少人:"))
# 按相关公式计算理论值
Pn = 1 - factorial(365) / (365**n * factorial(365-n))
print("一个班", n, "个人中至少有两个人生日相同的概率:")
print("理论值 =", Pn)
# 进行随机实验
EXP_NUM = 10000 # 实验次数
counter = 0 # 计数器,统计出现重复生日的次数
birthdays = [] # 用来存储随机产生的生日的列表
for i in range(EXP_NUM):
for j in range(n):
birthdays.append(random.randint(1,365)) # 产生生日表
if len(birthdays) > len(set(birthdays)): # 如果有重复
counter = counter + 1 # 累计重复次数
birthdays = [] # 重置生日表
print("实验值 =", counter/EXP_NUM)
输入23个人:
请输入一个班有多少人:23
23
一个班 23 个人中至少有两个人生日相同的概率:
理论值 = 0.5072972343239854
实验值 = 0.5096
输入50个人:
请输入一个班有多少人:50
50
一个班 50 个人中至少有两个人生日相同的概率:
理论值 = 0.9703735795779884
实验值 = 0.9718
虽然有点儿违反直觉,但事实上就是这样的。
这里是《简单又好玩的Python》栏目,我们的口号是“Python不用学,用用你就会”。欢迎关注!
源代码文件地址:
最后
以上就是欢喜酸奶为你收集整理的python生日相同的概率_50个人中有人生日相同的概率高达97%,你信吗?的全部内容,希望文章能够帮你解决python生日相同的概率_50个人中有人生日相同的概率高达97%,你信吗?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复