1. 程式人生 > 其它 >python隨機生成生日測試生日悖論

python隨機生成生日測試生日悖論

技術標籤:python資料結構學習python演算法

生日悖論指如果一個房間裡有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

哈哈,這次試驗剛好概率五五開。