d
This commit is contained in:
71
24-10/mont_carlo.py
Normal file
71
24-10/mont_carlo.py
Normal 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()
|
||||
Reference in New Issue
Block a user