Баскетбольный симулятор Монте-Карло - PullRequest
0 голосов
/ 24 января 2020

Мой код предназначен для имитации игры в баскетбол, которая имитирует 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,'%')
...