Есть ли обратный способ найти количество людей с заданной вероятностью 0,5, что у двух людей будет один и тот же день рождения, но без использования математической формулы?

Я делаю парадокс дня рождения и хочу знать, сколько людей могут встретить вероятность 0,5 того, что у двух людей один день рождения, используя python.

Я пробовал не использовать математическую формулу, чтобы найти вероятность с заданным количеством людей, используя случайный и рандомный в питоне

import random
def random_birthdays():
    bdays = []
    bdays = [random.randint(1, 365) for i in range(23)]
    bdays.sort()
    for x in range(len(bdays)):
        while x < len(bdays)-1:
            print x
            if bdays[x] == bdays[x+1]:
                #print(bdays[x])
                return True
            x+=1
        return False
count  = sum(random_birthdays() for _ in range(1000))
print('In a sample of 1000 classes each with 23 pupils, there were', count, 'classes with individuals with the same birthday')

Я ожидаю некоторых подсказок или кодов, которые могут помочь мне в этом.


person hengjun    schedule 05.09.2019    source источник
comment
Очень непонятно, о чем вы спрашиваете. Можете ли вы попытаться быть более ясным?   -  person Bjarke Kingo    schedule 06.09.2019


Ответы (1)


Ну, проблема с вашим кодом, вы проверяете только последовательное равенство дней рождения. Лучше проверить это с помощью наборов

Вдоль линии

import random

def sim(n):
    """simulate birthdays for n people"""
    a = set([random.randint(1, 365) for _ in range(n)])
    if len(a) == n:
        return False
    return True

print(sim(23))
print(sim(23))
print(sim(23))
print(sim(23))
print(sim(23))

Функция выше вернет true, если у n человек день рождения в один день, иначе false.

Назовите это 1000000 раз для n = 20, 21, ...., 25 и подсчитайте, сколько верных и ложных ответов.

Запуск кода

nt = 0
nf = 0
n = 23
for k in range(0, 1000000):
    if sim(n):
        nt += 1
    else:
        nf += 1

print((nt, nf))

для n = 23 и n = 22 произведено

(506245, 493755)
(475290, 524710)
person Severin Pappadeux    schedule 06.09.2019