Список парадоксов дня рождения нетипичный
Я пытаюсь решить парадокс дня рождения с Python. Я близок, но последний кусок потерял меня. Я использую случайный, чтобы создать список чисел с учетом диапазона и количества элементов для создания. Это работает.
Затем я проверяю, есть ли в списке (созданном выше) дубликаты. Это работает.
Затем я пытаюсь сгенерировать данный (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
2 ответа
Решение
В строке 5 вы печатаете t
но не возвращайте его, чтобы make_bd
возвращается None
, Измените строку на
return t
from random import randint
def make_bd(n, d):
"""Generates n birthdays in range(d)."""
return [randint(1, d) for _ in xrange(n)]
def has_dupe(bd):
"""Test to see if list of birthdays contains one or more duplicates.
This is based on problem #4.
"""
return len(set(bd)) < len(bd)
def dupe_bd(n, d, t):
dupes = sum(has_dupe(make_bd(n,d)) for _ in xrange(t))
return dupes/float(t)
def exactProbability(n, d):
probUnique = 1.0
d = float(d)
for i in xrange(n):
probUnique *= (d - i)/d
return 1.0 - probUnique
for n in xrange(18,26):
print("{:d} people: {:0.4f} probability of shared birthday (exact: {:0.4f})".format(n, dupe_bd(n, 365, 1000), exactProbability(n, 365)))
дает
18 people: 0.3640 probability of shared birthday (exact: 0.3469)
19 people: 0.3790 probability of shared birthday (exact: 0.3791)
20 people: 0.4020 probability of shared birthday (exact: 0.4114)
21 people: 0.4070 probability of shared birthday (exact: 0.4437)
22 people: 0.4720 probability of shared birthday (exact: 0.4757)
23 people: 0.4980 probability of shared birthday (exact: 0.5073)
24 people: 0.5290 probability of shared birthday (exact: 0.5383)
25 people: 0.5450 probability of shared birthday (exact: 0.5687)