# Experiment::monte-carlo import datetime from random import randint def getBirthdays(numberOfBirthDays): birthdays = [] # Список дней рожддения for i in range(numberOfBirthDays): # Год в нашей имитации роли не играет # Лишь бы в обьектах дней рождения он был одинаков startOfYear = datetime.date(2000,1,1) # случайный день года randomNumberOfDays = datetime.timedelta(randint(0,364)) birthday = startOfYear + randomNumberOfDays birthdays.append(birthday) return birthdays ''' Принимает список дней рождения. обрабатывает его и возвращает совпадения в датах, кот. Встречаются несколько раз. ''' def getMatch(birthdays): if len(birthdays) == len(set(birthdays)): return None # даты не совпадают, выход. for a, birthdayA in enumerate(birthdays): # enumerate() про списку for b, birthdayB in enumerate(birthdays[a+1 : ]): if birthdayA == birthdayB: return birthdayA # даты совпали def main(): # Кортеж мес в году MONTHS = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec') print("Симуляция совпадения дней рождения") while True: print("Сколько симуляции хотите сделать?\n PS max=100") response = input(":>") if response.isdecimal() and 0 < int(response) <= 100: numBDats = int(response) break print() # Генерируем и отображаем дни рождения birthdays = getBirthdays(numBDats) for i, birthday in enumerate(birthdays): if i != 0: print(", ", end='') month = MONTHS[birthday.month - 1] dateText = "{} {}".format(month, birthday.day) print(dateText, end='') print() print() print(f"Генерация {numBDats} случайных симуляции") input("Нажмите Enter для старта....") print("Запуск 100.000 симуляции") simMatch = 0 for i in range(100_000): if i % 10_000 == 0: print(i, " запущена симуляция...") birthdays = getMatch(birthdays) if getMatch(birthdays) != None: simMatch += 1 print(":"*11) print("Было выполнено 100.000 симуляции.") probability = round(simMatch/100_000*100,2) print("Процент совпадения",probability) print("Кол-во дат для исследования:",numBDats) print("Кол-во циклов симуляции:",simMatch) if __name__ == "__main__": main()