72 lines
3.5 KiB
Python
72 lines
3.5 KiB
Python
|
|
# 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()
|