python实现概率统计_python 概率统计

本文通过Python展示了如何计算至少两个人生日在同一天的概率,包括迭代计算、组合数的计算以及使用模拟方法进行验证。通过模拟和公式计算,观察到当人数增加时,至少两人同天生日的概率显著上升。

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

0818b9ca8b590ca3270a3433284dd417.png

由于如果使用公式的话365^300次方计算量很大,所以使用迭代的方式

for n in range(1, 366):

s = 1

for i in range(n):

s *= (365 - i) / 365

print(n, 1-s)

0818b9ca8b590ca3270a3433284dd417.png

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值