Probability calculator - copy method

Tell us what’s happening:

Hello! I’m working on the Probability Calculator Challenge for Scientific Computing with Python and I’m having trouble with the test_prob_experiment test function.
I’ve read something about using the copy method and use a copy of the hat for the experiment function in other posts, but I really don’t understand why I have to do that. Can someone explain that to me? Although I don’t know if that’s the only problem that makes my code fail. I would appreciate some help!

Your code so far

import copy
import random
from collections import Counter

class Hat:

    def __init__(self, **kwargs):
        self.contents = []

        for k in kwargs.keys():
            for v in range(0,kwargs.get(k)):
                self.contents.append(str(k))

    def draw(self,amount):
        pulled_balls = []
        if amount > len(self.contents):
            self.contents.extend(pulled_balls)
            #print("The number of balls to draw exceeds the available quantity, returning all the balls")
        else:
            for i in range(0,amount):
                contentslength = len(self.contents)
                randomnumber = random.randint(0,contentslength -1) #-1 to preven out of range
                pulled_balls.append(self.contents[randomnumber])
                self.contents.remove(self.contents[randomnumber])
        return pulled_balls
            

def experiment(hat,expected_balls,num_balls_drawn,num_experiments):

    M = 0 #how many times we get expected
    N = 0 #amount of experiments performed
    experiments = num_experiments
    
    for e in range(experiments):
        
        taken_balls = hat.draw(num_balls_drawn)
        extracted = Counter(taken_balls) #convert to dict format
        contains_all = True

        #if Extracted contains Expected, M += 1
        for k,v in expected_balls.items():
            if k in extracted.keys() and extracted.get(k) >= expected_balls.get(k):
                contains_all = True
            else:
                contains_all = False
                
        if contains_all == True:
                M += 1
            
        N += 1
                    

    probability = M/N
    return probability
    #print("Probability: ",probability)


#hat = Hat(blue=3,red=2,green=6)
#experiment(hat=hat, expected_balls={"blue":2,"green":1}, num_balls_drawn=4, num_experiments=1000)
#expected probability 0.272

The console

The repl.it
Link

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36.

Challenge: Probability Calculator

Link to the challenge:

Your propability is basically zero - so basically your expirement doesn’t return the right amount of balls ever.

If I see it correctly, I think you just never resett your hat. In practical terms: You never return the balls you drew. Your hat is empty after the second of 1000 experiments.

1 Like

Thank you! I was just thinking about that, because of the strange amount of “successful matches” that was returning in the M variable! That was it, thank you very much!