Files
itc_projects/python/24.10.25/lecture_montecarlo.py

72 lines
3.5 KiB
Python
Raw Normal View History

2025-10-25 18:42:49 +05:00
# 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()