2012-11-27 4 views
3

Пытается сделать программу рождения на питоне. Будучи новичком в Python, у меня проблемы.Python 3.3: Вероятность рождения:

  1. Функции дубликаты (л), которая принимает список л и возвращает истину, если она имеет двойственный элемент, и ложное, если это не так.
  2. Функция test (count) генерирует список count случайные целые числа от 1 до 365. Повторяющиеся функции (l) будут проверять дубликаты.
  3. Функция вероятность (количество, Num) работает Num испытания количества людей, и подсчитывает количество тестов с дубликатами. Он возвращает часть тестов с дубликатами - количество дубликатов, деленное на число.

результаты должны выглядеть следующим образом:

Для 2-х человек, вероятность 2 дней рождения является 0,002.

Для 3 человек вероятность 2 дней рождения равна 0,008. и так далее ...


Застрял на шаге 2 & 3:

import random 

# not sure what to put for count 
count = [random.randint(1, 365)] 

def duplicates(l): 
    if len(l)!=len(set(l)): 
     return True 
    else: 
     return False 

def test(count): 
    return [random.randint(1, 365)] 

#def probability(count,num): 

Я считаю, что я сделал шаг один правильно, но я не уверен, куда идти отсюда.

+1

Небольшая помощи с шагом 2: 'тестом четкости (счет): возвращение [random.randint (1365) для й в диапазоне (количество)]' – jdotjdot

ответ

4

Вам следует создать список, подобный этому. test - не очень полезное имя. Рассмотрим что-то вроде make_birthday_list вместо

def test(count): 
    return [random.randint(1, 365) for x in range(count)] 

тест в дубликатах уже оценивается как логическое значение, так что вы можете просто сделать это. Это не очень хорошая идея использовать l в качестве имени переменной (выглядит слишком много, как 1), поэтому я изменил его на the_list

def duplicates(the_list): 
    return len(the_list)!=len(set(the_list)) 

Вы должны запустить тест over and over, чтобы получить вероятность того

например ,

num_samples = 10000 
for count in range(100): 
    dup = 0 
    for test_number in range(num_samples): 
     the_list = make_birthday_list(count) 
     if duplicates(the_list): 
      dup += 1 
    print(count, dup/num_samples) #/returns a float in Python3 
+0

Спасибо очень для вашего времени. Я много узнал о Python из вашего ответа. – Ace

1

test не возвращает список длины count. Результат имеет только один элемент. Вы хотели бы, чтобы использовать список понимания, чтобы получить эту работу хорошо:

[random.randint(1, 365) for x in range(count)] 

Тогда для шага 3:

def probability(count,num): 
    dup_trues = sum([duplicates(test(count)) for i in range(num)]) #*** 
    dup_falses = num-dup_trues 
    return float(fails)/num 

Принимающей важная строка в приведенной выше функции помечена #*** Вот расстройство как это работает:

Материал в квадратных скобках - это понимание списка.

for i in range(num) говорит, что это делает с i = 0, i = 1, ... i = num-1. Вы знаете, что делают дубликаты и тесты. Таким образом, список заканчивается кучей истин и фальсов (одни и нули)

sum содержит элементы списка. Таким образом, это дает нам количество истин

Следующая строка dup_falses = num-dup_trues говорит, что мы имеем несколько результатов, а те, которые неверны, являются ложными.

return float(fails)/numfloat не является необходимым в питоне 3

+0

приветствуются – Sheena