72 lines
2.9 KiB
Python
72 lines
2.9 KiB
Python
# 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()
|