我試圖用Python解決生日悖論。我很接近,但最後一塊讓我無所適從。我使用random來生成一個數字列表,給出了要創建的項目的範圍和數量。這樣可行。生日悖論列表是非類型
然後檢查一下(上面生成的)列表是否有重複。這樣可行。
然後我嘗試生成給定(n)的列表。這是我遇到麻煩的地方。它生成一個列表,然後返回「NoneType」不可迭代。令我困惑的是,該列表已生成,但Python並未將其視爲列表。
下面的代碼:
def make_bd(n, r):
"""Generates (r) numbers of birthdays in a range (n)."""
import random
t = [random.randrange(n) for i in range(r)]
print (t)
def has_dupe(test):
"""Here I test to see if I can detect a duplicate birthday.
This is based on problem #4."""
d = []
count = 0
for number in test:
if number in d:
count = count + 1
d.append(number)
if count >= 1:
return True
return False
def dupebd(n,r,t):
count_dupe = 0
for i in range(n):
if has_dupe(make_bd(r,t)):
count_dupe = count_dupe + 1
print (float(count)/n)
dupebd(50,365,23)
這裏的結果:
>>> has_dupe(make_bd(50,6))
[13, 3, 8, 29, 34, 44]
Traceback (most recent call last):
File "<pyshell#45>", line 1, in <module>
has_dupe(make_bd(50,6))
File "<pyshell#44>", line 7, in has_dupe
for number in test:
TypeError: 'NoneType' object is not iterable
注意你的算法會快很多,如果在'has_dupe'使用一組而不是列表爲'D'作爲測試一組中的成員比列表中的成員快得多。您也可以在發現一個重複項時立即返回「True」來使操作短路。你也可以用'len(set(test))== len(test)'''做同樣的測試,因爲集合不包含重複項。 –
我會爲此努力。 –