Почему я не получаю ошибку, но код не работает? - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь написать код для класса, который идентифицирует вероятность того, что два или более данных человека могут иметь один и тот же день рождения из группы, выполняя этот эксперимент 10 ^ 6 раз, а затем вычисляя долю раз, в течение которых два или у большего количества людей был тот же самый день рождения. Я приложил код ниже, но когда я пытаюсь запустить его, ничего не происходит. Он не выдает сообщение об ошибке, он просто перестает работать. У кого-нибудь есть идеи почему?

    -
 import random

 def calc_birthday_probability (num_people):

     random.seed (2020) # Don't change this value
     num_trials = 1000000
     probability = 0
     list1 = []
     num_people = int(input())
     repeats = 0
     for i in range(0,num_trials+1):

         for i in range (0,num_people+1):
            list1.append(random.randint (1,3655))
            for i in list1:
                if list1.count(i)>1:
                    repeats +=1
                    i = i+1
                i = i+1

    prob = repeats//num_trials
    probability = probability + prob

    return probability

a = calc_birthday_probability(10)

print(a)

Ответы [ 3 ]

3 голосов
/ 15 марта 2020

num_people = int (input ()) Classi c, вам уже присвоен параметр в функции, но вы вводите для него ввод. Ваша программа просто ждет, когда вы что-то введете.

Обычно хороший прием, когда программа python ничего не делает, несмотря на то, что от нее ожидают выполнения какого-либо действия, состоит в проверке того, ожидает ли она каких-то или нет. вид ввода:)

Редактировать # 1: как заметил @rkatkam, вы используете одну и ту же переменную l oop (в частности, i ) для обоих циклов for.

2 голосов
/ 15 марта 2020

Во всех циклах for в функции вы использовали переменную i, и поэтому ее область действия также не подходит для определения.

Должно работать что-то вроде следующего, оно работало для меня:

def calc_birthday_probability (num_people):

    random.seed (2020) # Don't change this value
    num_trials = 1000000
    probability = 0
    list1 = []
    repeats = 0
    for i in range(0,num_trials+1):

        for j in range (0,num_people+1):
            list1.append(random.randint (1,3655))
            for k in list1:
                if list1.count(j)>1:
                    repeats +=1
                    k = k+1

    prob = repeats//num_trials
    probability = probability + prob

    return probability

И некоторые советы:

  1. Попробуйте сначала протестировать свой код с меньшим num_trials, пока не найдете точные результаты.

  2. У вас есть аргумент, который принимает значение num_people, и функция также имеет input() для того же самого.

  3. Когда вы пытаетесь напечатать вывод, напечатайте также некоторую другую строку, чтобы определить, закончилась ли функция.

0 голосов
/ 15 марта 2020

Упрощенная версия вашего кода

import random

def calc_birthday_probability(number_of_people = 30, num_trials=1000):
    dups_found = 0
    for _ in range(num_trials):
        birthdays = [random.randint (1,365) for _ in range(number_of_people)]

        # set of birthdays which are duplicates
        duplicates = set(x for x in birthdays if birthdays.count(x) > 1)

        if len(duplicates) >= 1:
            dups_found += 1   # increment since at least one duplicate

    return number_of_people, dups_found/num_trials * 100


num_people = int(input("Number of people: "))
print(f'{calc_birthday_probability(num_people, 1000):.2f}%')

Тест

Тестирование только с 1000 испытаний, поскольку достаточно для сравнения результатов с ссылкой

for num_people in range(1, 52, 2):
  print(f'{num_people} --> {calc_birthday_probability(num_people, 1000):.2f}%')

Выход

1 --> 0.00%
3 --> 0.40%
5 --> 3.10%
7 --> 6.10%
9 --> 9.90%
11 --> 13.70%
13 --> 19.00%
15 --> 25.30%
17 --> 34.60%
19 --> 37.70%
21 --> 46.50%
23 --> 53.30%
25 --> 57.30%
27 --> 59.60%
29 --> 70.40%
31 --> 72.40%
33 --> 77.90%
35 --> 81.60%
37 --> 84.30%
39 --> 87.90%
41 --> 89.30%
43 --> 93.40%
45 --> 93.70%
47 --> 95.00%
49 --> 96.10%
51 --> 96.60%
...