您现在的位置是:首页 >技术教程 >python计算概率网站首页技术教程
python计算概率
假设每人的生日在一年 365 365 365 天中的任一天是等可能的,那么随机选取 n ( n ≤ 365 ) n(nleq365) n(n≤365) 个人,他们的生日各不相同的概率为多少?
解:基本事件总数为 36 5 n 365^n 365n,从 365 365 365 天中选出不同的 n n n 天,共有 C 365 n C_{365}^n C365n 种不同的可能, n n n 个人在每种被选出的 n n n 天中共有 n ! n! n! 种排列的方法,生日各不相同的情况总共有 C 365 n ⋅ n ! C_{365}^ncdot n! C365n⋅n! 种,所以所求概率为: p 1 = C 365 n ⋅ n ! 36 5 n = A 365 n 36 5 n p_1=dfrac{C_{365}^ncdot n!}{365^n}=dfrac{A_{365}^n}{365^n} p1=365nC365n⋅n!=365nA365n. 由此也可以得出 ”至少有两个人生日相同“ 的概率为: p 2 = 1 − p 1 = 1 − C 365 n ⋅ n ! 36 5 n = 1 − A 365 n 36 5 n p_2=1-p_1=1-dfrac{C_{365}^ncdot n!}{365^n}=1-dfrac{A_{365}^n}{365^n} p2=1−p1=1−365nC365n⋅n!=1−365nA365n.
如果一个班级有 64 个人,那么这个班级至少有两个人生日相同的概率为:0.997
def permutations(n,m): # 定义一个函数,计算 n*(n-1)*(n-2)*...*(n-m+1)
permutation = 1 # 排列数,初值为1
for i in range(n-m+1,n+1): # for 循环遍历 (n-m+1)到n
permutation *= 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个元素就退出循环
break
else: # 否则就往li中添加元素
temp = [] # 定义一个临时列表
# 利用循环,往这个临时列表中添加元素
while 1:
a = random() # 生成一个 [0,1)之间的随机数,是一个小数
if len(temp) == 64: # 如果temp列表中有64个元素就退出里面的这个while循环
break
else: # 否则就往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个班级中有生日重复的同学。这个概率还是非常大的。