Мой код предназначен для имитации игры в баскетбол, которая имитирует 30-секундную игру с отставанием в 3 очка.
Игрок должен выбрать, стрелять ли по 3 указателю, что требует больше времени до t ie игра и восстановить владение, или быстро выстрелить 2-указателем, который быстрее, и потратить оставшееся время, чтобы восстановить владение, обратившись (противник делает 2 штрафных броска, и мы возвращаем владение) игроку, который не может делать штрафные броски. Игра моделируется около 10000 раз, чтобы увидеть, какая игра имеет самый высокий коэффициент выигрыша. Проблема в том, что у меня есть «владение» - это True / False (Boolean), но когда я запускаю его через функции, он возвращается как int. Кроме того, «точечная разница» всегда одинакова при каждом запуске кода.
Во-первых, почему моя булева переменная возвращается как целое число? И, во-вторых, коэффициент выигрыша должен варьироваться, поскольку это случайный эксперимент, но присутствуют только 2 результата. Как этот код можно настроить так, чтобы моё моделирование давало случайные результаты?
import numpy as np
trials=10000
threeptpercentage=34.6
midrangepercentage=49.5
opposingmidrangepercentage=55.4
opponentfreethrowpercentage=60.6
timetoshoot2=4
timetoshoot3=7
timetofoul=2
offensereboundpercent=66.4
ftreboundpercent=64.3
pointsdown=3
timeleft=30
haveposession=True
wins3=0
wins2=0
wintake3=[]
wintake2=[]
def foul(timeleft,pointsdown,haveposession):
#if we don't have the posession, foul to regain posession
timeleft=timeleft-timetofoul
#opponent takes 2 free throw
if np.random.randint(1,101)<=opponentfreethrowpercentage:
pointsdown=pointsdown+1
if np.random.randint(1,101)<=opponentfreethrowpercentage:
pointsdown=pointsdown+1
haveposession=True
#opponent misses the freethrow and we rebound it
else:
if np.random.randint(1,101)<=ftreboundpercent:
haveposession=True
elif np.random.randint(1,101)<=offensereboundpercent:
pointsdown=pointsdown+2
haveposession=True
return haveposession,timeleft,pointsdown
def take3(timeleft,pointsdown,haveposession):
timeleft = timeleft-timetoshoot3
#do we make the shot?
if np.random.randint(1,101)<=threeptpercentage:
pointsdown=pointsdown-3
haveposession=False
#can we rebound?
else:
if np.random.randint(1,101)<=ftreboundpercent:
haveposession=False
pointsdown=pointsdown-2
elif np.random.randint(1,101)<=opposingmidrangepercentage:
pointsdown=pointsdown+2
haveposession=True
return haveposession,timeleft,pointsdown
#attempt to make a 2 and hope for another posession
def take2(timeleft,pointsdown,haveposession):
#if we are down by 3 or more, take the 2 quickly. if we are down by 2 or less, we tun down the clock
timeleft = timeleft-timetoshoot2
#do we make the shot?
if np.random.randint(1,101)<=midrangepercentage:
pointsdown=pointsdown-2
haveposession=False
#can the opponent rebound?
else:
if np.random.randint(1,101)<=ftreboundpercent:
haveposession=False
pointsdown=pointsdown-2
return haveposession,timeleft,pointsdown
for i in range(1,trials+1):
while timeleft>0:
if haveposession==True:
timeleft,pointsdown,haveposession=take3(timeleft,pointsdown,haveposession)
else:
timeleft,pointsdown,haveposession=foul(timeleft,pointsdown,haveposession)
if pointsdown<0:
wintake3.append(wins3)
while timeleft>0:
if haveposession==True:
timeleft,pointsdown,haveposession=take2(timeleft,pointsdown,haveposession)
else:
timeleft,pointsdown,haveposession=foul(timeleft,pointsdown,haveposession)
if pointsdown<0:
wintake2.append(wins2)
winrate3=len(wintake3)*100/trials
winrate2=len(wintake2)*100/trials
print('Winrate if shoot a 3-pointer =',winrate3,'%')
print('Winrate if shoot a 2-pointer =',winrate2,'%')