This commit is contained in:
sophron
2025-10-24 13:29:25 +05:00
parent 01681ef20c
commit 35e4ef07f7

71
24-10/mont_carlo.py Normal file
View File

@@ -0,0 +1,71 @@
# 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()