Making roulette without predicting the location of the ball

Hi!
I’m trying to build a roulette wheel that participants can’t predict the position of ball.
I trying as this:

The speed with which the ball revolves around the wheel

speed = 0.125

The radius of the wheel around which the ball is revolving

wheel_radius=0.45

How many frames per second the animation should use

fps = 30

Noting the starting position of the revolving ball

position = 0.0

Noting whether the ball is decelerating

decelerate = False

Draw a circle

ball = visual.Circle(win, edges=100, radius=0.02, fillColor=‘white’, lineColor=None, pos=[position,position])

Draw a circle

wheel = visual.RadialStim(win, pos=(0,0), size=((wheel_radius * 2), (wheel_radius * 2)),
color = ‘pink’, angularCycles=5, radialCycles = 0, opacity= 0.8, autoLog=False)

Assign Numbers as Texts

text100 = visual.TextStim(win, text=‘100’, font=‘’, pos=(0.0, 0.3), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘LTR’, autoLog=None, autoDraw=False)

text200 = visual.TextStim(win, text=‘200’, font=‘’, pos=(0.2, 0.2), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘LTR’, autoLog=None, autoDraw=False)

text300 = visual.TextStim(win, text=‘300’, font=‘’, pos=(0.3, 0.1), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘LTR’, autoLog=None, autoDraw=False)

text400 = visual.TextStim(win, text=‘400’, font=‘’, pos=(0.3, -0.1), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘LTR’, autoLog=None, autoDraw=False)

text500 = visual.TextStim(win, text=‘500’, font=‘’, pos=(0.2, -0.2), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘LTR’, autoLog=None, autoDraw=False)

text600 = visual.TextStim(win, text=‘600’, font=‘’, pos=(0.0, -0.3), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘LTR’, autoLog=None, autoDraw=False)

text700 = visual.TextStim(win, text=‘700’, font=‘’, pos=(-0.2, -0.2), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘LTR’, autoLog=None, autoDraw=False)

text800 = visual.TextStim(win, text=‘800’, font=‘’, pos=(-0.3,-0.1), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘LTR’, autoLog=None, autoDraw=False)

text900 = visual.TextStim(win, text=‘900’, font=‘’, pos=(-0.3, 0.1), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘LTR’, autoLog=None, autoDraw=False)

text1000 = visual.TextStim(win, text=‘1000’, font=‘’, pos=(-0.18, 0.2), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘LTR’, autoLog=None, autoDraw=False)

Show the amount of property

text_prop = visual.TextStim(win, text=calculator[0], font=‘’, pos=(0.6, 0.3), height=0.035, wrapWidth=None, color=‘black’,
ori=0.0, bold=False, italic=False, alignText=‘center’, languageStyle=‘Arabic’, autoLog=None, autoDraw=False)
#if calculator[1] == 0:

text_prop.setText(calculator[2])

#else:

text_prop.setText(calculator[0])

polygon_2 = visual.Rect(
win=win, name=‘polygon_2’,
width=(0.25, 0.05)[0], height=(0.25, 0.05)[1],
ori=0.0, pos=(0.6, 0.3), anchor=‘center’,
lineWidth=2.0, colorSpace=‘rgb’, lineColor=‘white’, fillColor=None,
opacity=None, depth=-4.0, interpolate=True)

While speed is greater than 0:

while speed > 0:

# Change the position of the ball according to the current value of position
ball.pos = [((math.sin(position)/10) * (wheel_radius * 10)),
            ((math.cos(position)/10) * (wheel_radius * 10))]

# Produce the visualization of the wheel            
wheel.draw()

# Produce the visualization of the ball
ball.draw()

# Produce the visualization of texts
text100.draw()
text200.draw()   
text300.draw()  
text400.draw()   
text500.draw()   
text600.draw() 
text700.draw()
text800.draw()
text900.draw()
text1000.draw()
text_prop.draw()

polygon_2.draw()

# If the participant hasn't asked to stop the spinner yet
if decelerate == False:

    # Continue spinning the ball around the wheel according to the specified speed
    position += speed

# If the participant has asked to stop the spinner
if decelerate == True:

    # Randomly select a value between 0.005 and 0.035
    rand_dec = random.uniform(0.005,0.035)

    # Reduce speed to be a percentage (99.5% - 96.5%) of its last value
    # Randomizing the the value of the deceleration will hopefully prevent 
    # participants from being able to predict where the ball will stop. Also
    # making speed a fraction or what it once was, rather than using a linear value
    # will better model friction and exponential decay in the real world
    speed *= 1 - rand_dec

    # Continue spinning the ball around the wheel according to the new speed
    position += speed

# If speed drops below 0.001
if speed < 0.001:
    # Round speed down to 0
    speed = 0

    ball_x = round(ball.pos[0], 2)
    ball_y = round(ball.pos[1], 2)
    
    if -0.14 <= ball_x <= 0.14:
        if 0.43 <= ball_y <= 0.45:
            new_benefit = 100
                
        elif -0.45 <= ball_y <= -0.43:
            new_benefit = 600
      
    elif 0.14 < ball_x <= 0.36:
        if 0.26 <= ball_y < 0.43:
            new_benefit = 200
            
        elif -0.43 < ball_y <= -0.26:
            new_benefit = 500
                
    elif 0.36 < ball_x <= 0.45:
        if 0 <= ball_y < 0.26:
            new_benefit = 300
                
        elif -0.26 < ball_y < 0:
            new_benefit = 400
                
    elif -0.36 <= ball_x < -0.14:
        if 0.26 <= ball_y < 0.43:
            new_benefit = 1000
            #if new_benefit == 1000:
             #  continueRoutine = False
               
        elif -0.43 < ball_y <= -0.26:
            new_benefit = 700
                
    elif -0.45 <= ball_x < -0.36:
        if -0.26 < ball_y < 0:
            new_benefit = 800
            
        elif 0 <= ball_y < 0.26:
            new_benefit = 900
         
    core.wait(0.5)
    calculator = property_calculator(calculator[3], calculator[1], new_benefit, 0, calculator[0], calculator[2])
if calculator[1] == 1000:
    continueRoutine = False # end the current routine
    trials2.finished = True # exit the current loop (if your loop is called "trials    
# If escape is pressed, end the task
if event.getKeys('escape'):
    break      

 #If space is pressed, begin slowing the ball
if event.getKeys('space'):
    decelerate = True
    
# Refresh the screen according to the core.wait rate allowing for objects and visualizations
# to change position
win.flip()

# How long psychopy should wait before updating the screen   
core.wait(1/fps)

Can anyone help me?