某班级有n个人,(n<=365)问至少有两个人的生日在同一天的概率有多大?

由于如果使用公式的话365^300次方计算量很大,所以使用迭代的方式
for n in range(1, 366):
s = 1
for i in range(n):
s *= (365 - i) / 365
print(n, 1-s)

n=50 时 已经很大了
组合数的计算,默认使用小数,可以指定使用整数计算
from scipy.special import comb, perm
print(comb(10, 2))
print(comb(10, 2, exact=True))
print(perm(10, 2))
print(perm(10, 2, exact=True))
45.0
45
90.0
90
模拟计算,使用模拟数据和公式计算的对比,基本符合要求
from scipy import stats
def fun1(n):
"""
使用公式迭代,计算n个人时,至少两人同一天生日的函数
:param n:
:return:
"""
s = 1
for i in range(n):
s *= (365 - i) / 365
# print(n, 1 - s)
return 1 - s
def moni(n):
"""
模拟n个人的生日情况的函数,返回模拟的结果
如果存在两人同一天生日返回1,否则返回0
:param n:
:return:
"""
# 0--364 表示 365 天
x = range(365)
# p表示概率
p = [1 / 365 for i in range(365)]
# 构造随机变量
birth = stats.rv_discrete(values=(x, p))
# 获取其中一组观测值
res = birth.rvs(size=n)
# print(res)
# 判断res中是否有相同的数字
s = set()
for i in res:
if i in s:
# 说明有两个人同一天生日
return 1
else:
s.add(i)
return 0
def fun2(n):
"""
模拟计算n个人时,至少两人同一天生日概率
:param n:
:return:
"""
# cnt表示出现至少两人生日同一天的次数
cnt = 0
# 模拟次数
all_num = 1000
for i in range(all_num):
cnt += moni(n)
ans = cnt / all_num
return ans
for i in range(1, 365):
print(i, fun1(i), fun2(i))
# fun2(10)
1 0.0 0.0
2 0.002739726027397249 0.002
3 0.008204165884781345 0.007
4 0.016355912466550215 0.02
5 0.02713557369979347 0.025
6 0.040462483649111425 0.044
7 0.056235703095975365 0.059
8 0.07433529235166902 0.083
9 0.09462383388916673 0.093
10 0.11694817771107768 0.125
11 0.14114137832173312 0.157
12 0.1670247888380645 0.174
13 0.19441027523242949 0.17
14 0.2231025120049731 0.223
15 0.25290131976368646 0.252
16 0.2836040052528501 0.293
17 0.3150076652965609 0.31
18 0.3469114178717896 0.348
19 0.37911852603153695 0.371
20 0.41143838358058027 0.441
21 0.443688335165206 0.43
22 0.4756953076625503 0.505
23 0.5072972343239857 0.52
24 0.538344257914529 0.572
25 0.568699703969464 0.527
26 0.598240820135939 0.601
27 0.6268592822632421 0.637
28 0.6544614723423995 0.67
29 0.6809685374777771 0.683
30 0.7063162427192688 0.703
31 0.7304546337286439 0.742
32 0.7533475278503208 0.741
33 0.7749718541757721 0.778
34 0.7953168646201543 0.788
35 0.8143832388747153 0.817
36 0.8321821063798795 0.827
37 0.8487340082163846 0.84
38 0.864067821082121 0.889
39 0.878219664366722 0.87
40 0.891231809817949 0.895
41 0.9031516114817354 0.888
42 0.9140304715618692 0.922
43 0.9239228556561199 0.921
44 0.9328853685514263 0.936
45 0.940975899465775 0.953
46 0.9482528433672548 0.953
47 0.9547744028332994 0.948
48 0.9605979728794225 0.958
49 0.9657796093226765 0.971
50 0.9703735795779884 0.964
51 0.9744319933344283 0.975
52 0.9780045093342753 0.982
53 0.9811381134839128 0.978
54 0.9838769627588515 0.988
55 0.9862622888164461 0.984
56 0.9883323548852008 0.991
57 0.9901224593411699 0.995
58 0.9916649793892612 0.991
59 0.992989448417817 0.997
60 0.994122660865348 0.99
61 0.9950887988052908 0.996
62 0.9959095748953655 0.992
63 0.9966043868309472 0.996
64 0.9971904789669755 0.996
65 0.9976831073124921 1.0
66 0.9980957046404045 0.997
67 0.9984400429793998 0.998
68 0.9987263912544141 0.998
本文通过Python展示了如何计算至少两个人生日在同一天的概率,包括迭代计算、组合数的计算以及使用模拟方法进行验证。通过模拟和公式计算,观察到当人数增加时,至少两人同天生日的概率显著上升。
2087

被折叠的 条评论
为什么被折叠?



