0

So I have a code that chooses a random number between 1 and 2. If the code chooses 1, I want to increase the probability of choosing 1 by 10%. If the code chooses 2, I want to increase the probability of choosing 2 by 15%. Here is my code:

import pygame, random,sys

pygame.init()
SCREEN_WIDTH = 500
SCREEN_HEIGHT = 500
BLACK = (0,0,0)
white = "#FFFFFF"
win = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Test")

def test2():
win.fill(BLACK)

    test = random.randint(1,2) 
    text_font = pygame.font.Font('freesansbold.ttf', 100)
    screws_text = text_font.render(str(test), True ,white)
    textRect = screws_text.get_rect()
    textRect.center = (250,250)
    win.blit(screws_text, textRect)
    
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit() 
    pygame.display.update()

while True:

    for event in pygame.event.get():
        
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                test2()
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

I didn't really try anything because I had no idea what I should do, I never did that so I would be very grateful if you could help me.

Julia Meshcheryakova
  • 3,162
  • 3
  • 22
  • 42
  • Are the probabilities supposed to be updated after *every* draw, or just after the first draw? – pjs Jan 02 '23 at 18:56

2 Answers2

0

I suggest to use random.random() which returns a floating point value in the range [0.0, 1.0]. Choose one of the two numbers depending on a threshold that is calculated from the probability:

probability_1 = 1
probability_2 = 1
def test2():
    global probability_1, probability_2 

    threshold = probability_1 / (probability_1 + probability_2)
    test = 1 if random.random() < threshold else 2
    if test == 1:
        probability_1 += 0.1
    else:
        probability_2 += 0.15
Rabbid76
  • 202,892
  • 27
  • 131
  • 174
0

The choice function from the NumPy library lends the possibility to define the weights of each possible candidate as a list. This way, you can define a 50/50 chance initially, and modify with the call of a function, like this:

from numpy.random import choice

def choiceChanger(candidates, weights):
    draw = choice(candidates, 1, weights)
    if draw == 1:
        weights[1] += 0.05
        weights[2] -= 0.05
    else:
        weights[1] -= 0.075
        weights[2] += 0.075

    return weights

candidates = [1,2]
weightsDict = {1: 0.5, 2:0.5}
weights = [weightsDict[e] for e in weightsDict.keys()]

weights = choiceChanger(candidates, 1, weights)

I also think this way it's way easier to generalize, if you need to change the probabilities of more than two numbers: you'll just have to edit the function instead of the whole program.

The math of adding '0.05' instead of '0.1' is so the overall probability is 1. Same thing with '0.075', it's just the probability you want to add (15%) distributed across the possible choices (in this case 2) so 15% divided by 2.