您现在的位置是:首页 >技术教程 >python计算概率网站首页技术教程

python计算概率

Jackey_Song_Strange 2023-05-17 00:00:02
简介python计算概率

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

解:基本事件总数为 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! C365nn! 种,所以所求概率为: 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=365nC365nn!=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=1p1=1365nC365nn!=1365nA365n.

如果一个班级有 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个班级中有生日重复的同学。这个概率还是非常大的。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。