python隨機生成生日測試生日悖論
阿新 • • 發佈:2020-12-08
生日悖論指如果一個房間裡有23人或以上,那麼至少有兩個人生日相同的概率大於50%。
在閏年的情況下每年有366天,每天的日期都不同,因此可以用1-366數字替代:
x = random.randint(1, 366)
根據自己設定的房間人數將所有隨機生成的生日(即數字)新增到同一個列表內:
y = []
for i in range(n):
x = random.randint(1, 366)
y.append(x)
判斷在隨機生成的生日內有無重複生日,第一想法是進行比較,逐個對比,但是這樣會出現一個bug,當同一個列表內有多個相同元素時,會出現統計次數增加的情況。這時候,一個 神奇的函式set()出現了;
經過set()函式的變形之後,如果長度變化了,很明顯說明隨機生成的生日有重複的日期,隨機生成的生日有重複的記為1,
if len(y)!=len(set(y)):
print(1)
這樣單次實驗就OK了,剩下的就是將這個實驗重複進行多次,很簡單一個for迴圈搞定,然後再對有重複生日的次數進行統計,根據實驗的次數進行概率計算。
最後,附上完整程式碼:
import random
def fun(n):
count = 0
for i in range(100):
y = []
for i in range(n):
x = random.randint(1, 366)
y.append(x)
print("{0}...{1}".format(y,len(y)))
if len(y)!=len(set(y)):
count+=1
print(count)
print(count/100)
n=int(input("請輸入房間人數:"))
fun(n)
以及部分結果截圖:
請輸入房間人數:23
[72, 95, 344, 198, 7, 96, 88, 64, 151, 188, 158, 321, 35, 362, 169, 91, 175, 302, 78, 1, 340, 198, 180]...23
1
[192, 149, 68, 299, 68, 328, 201, 214, 326, 360, 366, 344, 281, 314, 187, 275, 318, 181, 52, 183, 265, 153, 359]...23
2
[121, 191, 284, 31, 17, 102, 341, 83, 224, 141, 145, 53, 284, 102, 351, 78, 266, 225, 167, 39, 316, 73, 277]...23
3
[155, 58, 157, 108, 10, 75, 205, 40, 302, 239, 16, 119, 249, 160, 192, 352, 217, 290, 251, 83, 161, 140, 33]...23
[85, 102, 312, 30, 141, 95, 90, 17, 122, 202, 34, 22, 268, 107, 350, 227, 26, 170, 116, 228, 302, 264, 67]...23
[342, 276, 275, 166, 143, 117, 98, 329, 302, 74, 363, 62, 161, 166, 22, 340, 207, 237, 143, 45, 279, 173, 313]...23
4
...............................
[23, 80, 180, 218, 39, 166, 38, 106, 247, 305, 235, 40, 41, 239, 190, 176, 306, 264, 150, 27, 217, 138, 317]...23
[241, 209, 219, 195, 164, 262, 343, 278, 144, 26, 209, 268, 153, 5, 70, 89, 27, 37, 355, 86, 66, 232, 76]...23
48
[61, 353, 104, 152, 278, 259, 134, 315, 216, 89, 39, 313, 324, 35, 59, 218, 49, 149, 216, 139, 305, 337, 312]...23
49
[238, 182, 104, 6, 94, 4, 31, 201, 326, 266, 257, 46, 342, 164, 43, 249, 143, 105, 52, 76, 108, 280, 313]...23
[192, 4, 200, 212, 95, 325, 164, 5, 309, 360, 5, 245, 150, 328, 20, 329, 235, 96, 226, 336, 148, 211, 307]...23
50
0.5
哈哈,這次試驗剛好概率五五開。