72 lines
3.5 KiB
Python
72 lines
3.5 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()
|
||
# Генерируем и отображаем дни рождения
|
||
day_birth = getBirthdays(numBDats) # Так как существует вторая переменная birthdays, то она перезаписывает данные по новому. По этому при выполнении кода на 59 строке переменная перезаписывается.
|
||
for i, birthday in enumerate(day_birth): # Изменение переменной(43 строка)
|
||
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 % 1_000 == 0: # меняем число с 10_000 на 1_000
|
||
print(i, " запущена симуляция...")
|
||
birthdays = getMatch(day_birth) # Изменение переменной(43 строка)
|
||
if getMatch(day_birth) != None: # Изменение переменной(43 строка)
|
||
simMatch += 1
|
||
print(":"*11)
|
||
print("Было выполнено 100.000 симуляции.")
|
||
probability = round(simMatch/100_000*100,2)
|
||
print("Процент совпадения",probability)
|
||
print("Кол-во дат для исследования:",numBDats)
|
||
print("Кол-во циклов симуляции:",simMatch)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|