Files
itc_projects/python/24.10.25/lecture_montecarlo.py
2025-10-25 18:42:49 +05:00

72 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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()