> 文章列表 > python计算概率

python计算概率

python计算概率

假设每人的生日在一年 365365365 天中的任一天是等可能的,那么随机选取 n(n≤365)n(n\\leq365)n(n365) 个人,他们的生日各不相同的概率为多少?

解:基本事件总数为 365n365^n365n,从 365365365 天中选出不同的 nnn 天,共有 C365nC_{365}^nC365n 种不同的可能,nnn 个人在每种被选出的 nnn 天中共有 n!n!n! 种排列的方法,生日各不相同的情况总共有 C365n⋅n!C_{365}^n\\cdot n!C365nn! 种,所以所求概率为:p1=C365n⋅n!365n=A365n365np_1=\\dfrac{C_{365}^n\\cdot n!}{365^n}=\\dfrac{A_{365}^n}{365^n}p1=365nC365nn!=365nA365n. 由此也可以得出 ”至少有两个人生日相同“ 的概率为:p2=1−p1=1−C365n⋅n!365n=1−A365n365np_2=1-p_1=1-\\dfrac{C_{365}^n\\cdot n!}{365^n}=1-\\dfrac{A_{365}^n}{365^n}p2=1p1=1365nC365nn!=1365nA365n.

如果一个班级有 64 个人,那么这个班级至少有两个人生日相同的概率为:0.997

def permutations(n,m): # 定义一个函数,计算 n*(n-1)*(n-2)*...*(n-m+1)permutation = 1   # 排列数,初值为1for i in range(n-m+1,n+1):   # for 循环遍历 (n-m+1)到npermutation *= i  # 乘在一起return permutation    # 返回排列数def CalculateProbability(n):   # 定义一个函数,计算概率return (1-permutations(365,64)/365**n)   # 返回1-(64*63*62*...*(365-64+1))/(365^64)print(CalculateProbability(64))    # 打印计算结果为 0.997...from random import random   # 导入随机数li = []   # 定义一个空的列表# 利用循环,生成1000000组1~365之间的随机数,每组有64个元素
while 1:if len(li) == 1000000:   # 如果li列表有1000000个元素就退出循环breakelse:  # 否则就往li中添加元素temp = []   # 定义一个临时列表# 利用循环,往这个临时列表中添加元素while 1:a = random()   # 生成一个 [0,1)之间的随机数,是一个小数if len(temp) == 64:  # 如果temp列表中有64个元素就退出里面的这个while循环breakelse:   # 否则就往temp中添加元素if 0<int(a*1000)<366:   # 生成的随机小数乘以1000后,如果在0~366之间,就添加到temp中temp.append(int(a*1000))li.append(temp)  # 将temp添加到li中count = 0 # 计数,初值为零for i in li: # 遍历列表当中的每一个元素a = set() # 定义一个集合a = set(i) # 将i列表强制转换成集合,会进行去重操作,如果有重复,说明这64个值中有重复的,也就意味着有生日相同的。if len(a) != 64:   # 如果集合a中的元素数量不等于64,说明进行了去重操作,有生日重复count += 1   # count值加一,计数print(count/1000000)  # 最后打印出计算结果,总共有1000000组数据,有生日重复的有count组,计算出比值,比值接近0.997(由于该程序计算量比较大,所以可能要久一点才能计算出结果,但不会慢到要1分钟才能计算出来。)
# 由此就可以验证计算结果的正确性。可以看出,每100个64人的班级中,就有99个班级中有生日重复的同学。这个概率还是非常大的。