Probability Caculator result 0.788

Hi All,

I’m not sure if my understanding of the question is correct.

I’m thinking that the purpose of copying the hat object in the experiment is to reset the scenario each time the draw takes place. Hence I’ve placed that step in a for loop when running the experiment.

I used issubset to compare the expected list and the drawn list. And I increment a success counter each time the expected list is a subset of the drawn list.

However, I’m not able to obtain the required probability and I’m quite far off.

Appreciate your help to correct my mistakes. Below is my code.

Thanks in advance.

import copy
import random
# Consider using the modules imported above.

class Hat:
    def __init__(self, **kwargs):
        self.dict = kwargs
        self.contents = []
        for key in self.dict:
            colour = key
            value = self.dict.get(key)
            for i in range (value):
                self.contents.append(colour)
                    

    def draw (self, no_of_balls):
        if no_of_balls > len(self.contents):
            return self.contents
        
        # removing balls from the hat    
        taken_out = random.sample(self.contents, no_of_balls)
        for element in taken_out:
            if element in self.contents:
                self.contents.remove(element)
            
        return taken_out


def experiment(hat, expected_balls, num_balls_drawn, num_experiments):
    
    # creating the list of expected draws   
    expected_list = []
    expectation = expected_balls
    for key in expectation:
        colour = key
        value = expectation.get(key)
        for i in range (value):
            expected_list.append(colour)
    
    # running the experiment and counting the successful ones
    successful_exp = 0
    N = num_experiments
    for i in range (N):
        c_hat = copy.deepcopy(hat)
        drawn = c_hat.draw(num_balls_drawn)
        if(set(expected_list).issubset(set(drawn))): 
            successful_exp += 1
    probability = successful_exp / N

    return probability

Consider what happens with list items when it’s cast into set. You may try few examples in your python interpreter and see what are the results.

Hi Sanity,

Thank you for pointing it out to me. I’ve amended and completed the challenge. My code is as follow.

import copy
import random
# Consider using the modules imported above.

class Hat:
    def __init__(self, **kwargs):
        self.dict = kwargs
        self.contents = []
        for key in self.dict:
            colour = key
            value = self.dict.get(key)
            for i in range (value):
                self.contents.append(colour)
                    

    def draw (self, no_of_balls):
        if no_of_balls > len(self.contents):
            return self.contents
        
        # removing balls from the hat    
        taken_out = random.sample(self.contents, no_of_balls)
        for element in taken_out:
            if element in self.contents:
                self.contents.remove(element)
            
        return taken_out


def experiment(hat, expected_balls, num_balls_drawn, num_experiments):
    
    # creating the list of expected draws   
    expected_list = []
    expectation = expected_balls
    for key in expectation:
        colour = key
        value = expectation.get(key)
        for i in range (value):
            expected_list.append(colour)
    
    # running the experiment and counting the successful ones
    successful_exp = 0
    N = num_experiments
    for i in range (N):
        c_hat = copy.deepcopy(hat)
        drawn = c_hat.draw(num_balls_drawn)
        check = []
        for i in expected_list:
            if i in drawn:
                drawn.remove(i)
                check.append(i)
        if len(expected_list) == len(check):
            successful_exp += 1
    probability = successful_exp / N

    return probability