我是靠谱客的博主 大力楼房,最近开发中收集的这篇文章主要介绍4.3.用python解決經典問題:生日悖論, birthday paradox1.問題描述及思路2.實現代碼3.試運行,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.問題描述及思路

生日悖論是指 在一羣人中, 出現兩个人(或多个人)的生日在同一天的概率遠比直覺判斷的大得多. 因此也可以解釋爲啥每个班都有人會在同一天過生的現象.

其實從數學上求解這个問題更簡單, n个人中出現同天生日的概率爲 1 - 365!/(365-n)!/(365**n), 但既然是編程解決, 就得用仿真的思路, 而不是代數思路.

要驗證這个情況, 可以用計算機隨機生成生日組合, 在多次(比如一百萬次)模擬後統計並計算概率.

以python來說, 引入隨機數模凷random即可:

首先指定人數, 然後生成相應人數的隨機生日組合列表, 再檢查生日列表中有無重復生日出現, 反復執行這个流程到指定的次數(比如一百萬次), 期間統計出現相同生日的次數, 就可計算出概率.



2.實現代碼

# 計算一羣人中出現相同生日的概率
import random
SIMULATION_TIMES = 1000000
# 模擬次數
people = max(2, int(input('請輸入人數: ')))
# 確保至少2人
def generate_bir(people):
"""生成指定人數的隨機生日列表"""
birs = []
for i in range(people):
bir_mon = random.randint(1, 12)
if bir_mon in [1, 3, 5, 7, 8, 10, 12]:
bir_day = random.randint(1, 31)
elif bir_mon == 2:
bir_day = random.randint(1, 29)
else:
bir_day = random.randint(1, 30)
birs.append((bir_mon, bir_day))
return birs
def check_bir(birs):
"""檢查是否有相同生日出現"""
for bir in birs:
if birs.count(bir) > 1:
return True
return False
# 一次示例
print(f'通過隨機生成{people}人的生日{SIMULATION_TIMES}次, 來計算概率, 如下:')
print(generate_bir(people))
# 1000000次模擬
same_times = 0
for i in range(SIMULATION_TIMES):
same_times += check_bir(generate_bir(people))
# 利用True/False在數值上爲1/0的特性
if (i+1) % 100000 == 0:
# 報告實時進度
print(f'已模擬 {i+1}組數據, 符合 {same_times}組, 實時概率爲 {same_times*100/(i+1)}%')

注意, 處理一下月份和天數的關係, 避免出現4月31這種錯誤情況.



3.試運行

先算下10人小人羣的概率:

請輸入人數: 10
通過隨機生成 10人的生日 1000000次, 來計算概率, 如下:
[(2, 19), (8, 11), (7, 9), (12, 23), (8, 3), (4, 12), (4, 3), (9, 7), (4, 5), (8, 17)]
已模擬 100000組數據, 符合 11737組, 實時概率爲 11.737%
已模擬 300000組數據, 符合 35088組, 實時概率爲 11.696%
已模擬 400000組數據, 符合 46973組, 實時概率爲 11.74325%
已模擬 500000組數據, 符合 58385組, 實時概率爲 11.677%
已模擬 600000組數據, 符合 70164組, 實時概率爲 11.694%
已模擬 700000組數據, 符合 82004組, 實時概率爲 11.714857142857143%
已模擬 800000組數據, 符合 93791組, 實時概率爲 11.723875%
已模擬 900000組數據, 符合 105470組, 實時概率爲 11.71888888888889%
已模擬 1000000組數據, 符合 117202組, 實時概率爲 11.7202%

使用概率公式計算的概率爲11.69%, 計算機模擬結果非常接近.


再算下24人的概率:

請輸入人數: 24
通過隨機生成24人的生日1000000次, 來計算概率, 如下:
[(5, 6), (11, 23), (3, 21), (3, 10), (5, 14), (1, 20), (2, 14), (9, 13), (8, 23), (10, 12), (11, 19), (10, 13), (11, 3), (4, 5), (11, 29), (7, 22), (10, 14), (2, 16), (12, 12), (12, 7), (3, 2), (8, 28), (2, 23), (6, 7)]
已模擬 100000組數據, 符合 53323組, 實時概率爲 53.323%
已模擬 200000組數據, 符合 106899組, 實時概率爲 53.4495%
已模擬 300000組數據, 符合 160779組, 實時概率爲 53.593%
已模擬 400000組數據, 符合 214232組, 實時概率爲 53.558%
已模擬 500000組數據, 符合 267713組, 實時概率爲 53.5426%
已模擬 600000組數據, 符合 321497組, 實時概率爲 53.58283333333333%
已模擬 700000組數據, 符合 375230組, 實時概率爲 53.604285714285716%
已模擬 800000組數據, 符合 428731組, 實時概率爲 53.591375%
已模擬 900000組數據, 符合 482340組, 實時概率爲 53.593333333333334%
已模擬 1000000組數據, 符合 536164組, 實時概率爲 53.6164%

使用概率公式計算的概率爲53.83%, 計算機模擬結果非常接近.


最後算下一般班級的學生人數, 50人的同生日概率:

請輸入人數: 50
通過隨機生成50人的生日1000000次, 來計算概率, 如下:
[(4, 30), (3, 29), (11, 7), (5, 2), (9, 19), (5, 20), (10, 1), (10, 21), (6, 21), (12, 23),
...
24), (3, 5), (4, 10), (11, 18), (3, 24), (8, 24)]
已模擬 100000組數據, 符合 96997組, 實時概率爲 96.997%
已模擬 200000組數據, 符合 193957組, 實時概率爲 96.9785%
已模擬 300000組數據, 符合 290934組, 實時概率爲 96.978%
已模擬 400000組數據, 符合 388010組, 實時概率爲 97.0025%
已模擬 500000組數據, 符合 485042組, 實時概率爲 97.0084%
已模擬 600000組數據, 符合 581990組, 實時概率爲 96.99833333333333%
已模擬 700000組數據, 符合 679039組, 實時概率爲 97.00557142857143%
已模擬 800000組數據, 符合 776041組, 實時概率爲 97.005125%
已模擬 900000組數據, 符合 873103組, 實時概率爲 97.01144444444445%
已模擬 1000000組數據, 符合 970130組, 實時概率爲 97.013%

公式計算的概率爲97.04%, 偏差不大, 這就解釋了基本上所有的班級中都會有同一天過生的情況啦.

人數越多, 越容易出現同生情況, 超過一百人後就只剩下理論上的不可能了.

最后

以上就是大力楼房为你收集整理的4.3.用python解決經典問題:生日悖論, birthday paradox1.問題描述及思路2.實現代碼3.試運行的全部内容,希望文章能够帮你解决4.3.用python解決經典問題:生日悖論, birthday paradox1.問題描述及思路2.實現代碼3.試運行所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部