Парадокс дня рождения Python - неверный вывод вероятности

У меня проблемы с программированием парадокса дня рождения в Python. Парадокс дня рождения в основном говорит о том, что если в классе 23 человека, вероятность того, что у двоих из них день рождения совпадет, составляет 50%.

Я попытался закодировать этот парадокс на Python, однако он продолжает возвращаться с вероятностью, близкой к 25%. Я очень новичок в Python, поэтому, несомненно, есть простое решение этой проблемы. Вот мой код:

import random


def random_birthdays():
    bdays = []
    bdays = [random.randint(1, 365) for i in range(23)]
    bdays.sort()
    for x in bdays:
        while x < len(bdays)-1:
            if bdays[x] == bdays[x+1]:
                print(bdays[x])
                return True
            x+=1
        return False

count = 0
for i in range (1000):
if random_birthdays() == True:
    count = count + 1


print('In a sample of 1000 classes each with 23 pupils, there were', count, 'classes with individuals with the same birthday')

person Alcor    schedule 12.10.2017    source источник
comment
Какую отладку вы сделали? Просить нас полностью отлаживать ваш код неуместно.   -  person Carcigenicate    schedule 12.10.2017
comment
И ответ на ваш второй вопрос — это принцип единой ответственности.   -  person jonrsharpe    schedule 12.10.2017


Ответы (4)


Ошибка в этой строке:

for x in bdays:

должно быть

for x in range(len(bdays)):

Потому что вам нужно перебирать индексы дней рождения, но не сами дни рождения.

И еще одна оптимизация:

count = 0
for i in range (1000):
    if random_birthdays() == True:
       count = count + 1

можно заменить на

count  = sum(random_birthdays() for _ in range(1000))
person Zefick    schedule 12.10.2017

Кроме того, ваша функция должна быть реализована так:

import random

def random_birthdays(pupils):
    bdays = [random.randint(1, 365) for _ in range(pupils)]
    return pupils > len(set(bdays))

Это устраняет так много источников ошибок.

Это можно назвать, как указал @Zefick:

count  = sum(random_birthdays(23) for _ in range(1000))
person quamrana    schedule 12.10.2017

Вот как я это написал.

# check probability for birthday reoccurance for a class of 23 students or the birthday paradox
import random as r

def check_date(students):
    date=[]
    count=0
    
    for i in range(students): # Generate a random age for n students
        date+=[r.randint(1,365)] # entire sample list for age is created
        
    for letter in date: # check if the date repeats anywhere else
        if date.count(letter)>=2: # Use count it's simple & easy.
            count+=1
            
    return count # count of a pair of students having same b.day

def simulations(s,students):
    result=[] # empty list to update data.
    simulation_match=0
    
    for i in range(s):
        result+=[check_date(students)] # get a sample list for all the students in 'n' no. of simulations
        
        if check_date(students)>1: # if atleat 2 students have same b.day in each simulation
            simulation_match+=1
            
    return simulation_match,s,int(simulation_match/s*100),'%'

simulations(1000,23) # 1000 simulations with 23 students sample size

OUT: (494, 1000, 49, '%') ** процентная часть зависит от сгенерированного случайного int**

person Chidhvilas    schedule 25.06.2020

person    schedule
comment
Спасибо за ответ. Однако, пожалуйста, рассмотрите возможность добавления пояснений, чтобы человек, задавший вопрос, мог лучше вас понять. - person Rayan Ral; 24.06.2020