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