Я пытаюсь запустить симуляцию Монте-Карло, используя Python, чтобы определить несколько сценариев плей-офф команд в моей лиге фэнтези-футбола. Но я еще не углубился в это, так как я застрял на первом шаге алгоритма.
Я определил, что первое, что я хочу сделать в алгоритме, это надежно выбрать 6Команды плей-офф таким образом, что если повторение 10000 раз должно довольно близко соответствовать вероятностям, которые я назначил командам.
Например, если я дал команде А вероятность 78% пройти в плей-офф, яхочу, чтобы алгоритм выбора моей команды выбирал команду A 7800 раз из 10000 с разумной степенью ошибки, может быть +/- 1%, например, 7700 - 7900 раз из 10000.
Алгоритм на английском языке в основном: "для каждой команды в лиге выберите случайный процент (1-100 / 100) и сравните его с вероятностью того, что команда попадет в плей-офф. Если бросок кубика меньше или равен вероятности команды пройти плей-офф, тодобавьте их в список.Если после прохождения всех 12 команд этот список имеет длину ровно 6, верните результат. В противном случае очистите список, нажмите звездочку. и продолжайте, пока у вас не будет ровно 6 ".
К сожалению, реальные результаты, которые я получаю, состоят в том, что команды с вероятностью выше 50% в итоге получают чуть больше матчей в плей-офф, а команды под 50%в вероятности заканчивают с немного меньшим количеством появлений плей-офф. Таким образом, команда 33% регулярно появляется 2800-2900 раз (28-29%), но команда с вероятностью 68% регулярно появляется 7100-7200 раз (71-72%)
Если я удалюта часть кода, которая проверяет, является ли список точной длиной 6, и разрешает ли списки всех длин, вывод становится более соответствующим вероятностям и находится в пределах погрешности 1%, которую я ищу. Но мне нужно, чтобы этот список имел точную длину 6. Итак, как мне обойти это?
Я довольно новичок в Python, так что будьте осторожны :) Совет очень важен, спасибо!
import random
#List is (team abbreviation, playoff odds)
AA = ["AA",.33]
BG = ["BG",.99]
BSC = ["BSC",.68]
BT = ["BT",.95]
CHA = ["CHA",.97]
DDB = ["DDB",.11]
EJ = ["EJ",.48]
KCT = ["KCT",.82]
MTA = ["MTA",.00]
NSR = ["NSR",.01]
TDP = ["TDP",.57]
THR = ["THR",.09]
teams = [AA,BG,BSC,BT,CHA,DDB,EJ,KCT,MTA,NSR,TDP,THR]
# Algorithm to pick the 6 playoff teams
# Dice roll turned into a percentage and compared against each team's probability
# Throw out any results that don't have exactly 6 teams
def playoffs():
while True:
playoff_list = []
for i in teams:
diceroll = random.randint(1,100) / 100
if i[1] >= diceroll:
playoff_list.append(i[0])
else:
continue
if len(playoff_list) == 6:
break
else:
continue
return playoff_list
# Function to run the above selection algorithm 10,000 times
# Add every 6-team scenario to one giant list with 60,000 items
def playoffs_check():
playoff_teams = []
playoff_test = 0
while playoff_test < 10000:
playoff_teams.extend(playoffs())
playoff_test += 1
return playoff_teams
# Run the algorithm
# Count the results so you can compare to the original probabilities
playoffs_list = playoffs_check()
for x in teams:
print(x[0],playoffs_list.count(x[0]))