# Probability Calculator - Experiment function

Hello everybody, it’s me again.

I am working on the final assignment and I am a bit stuck on the experiment function. Here’s what the description says

Each experiment consists of starting with a hat containing the specified balls, drawing several balls, and checking if you got the balls you were attempting to draw.

So, each experiments should run a N number of times. I should draw balls from the Hat and compare the result with what I expected. Everytime I get the expected I should add it until the numbers of experiments are complete. Here’s how my code for this part looks:

``````def experiment (Hat,num_balls_drawn,num_experiments,expected_balls):

for trials in range(num_experiments):
draws = Hat.draw(num_balls=num_balls_drawn)
draws_dict = dict_of_balls(draws)
total_trials = 0
probability_result = 0
for keys in draws_dict:
if expected_balls.keys():
return probability_result
``````

It’s still incomplete, my question is:

How do I compare the draws with what is expected? I was thinking that it would make more sense to compare them as dictionaries, because I could compare if the key was in there but also that the number as well.

This is my code so far:

``````import copy
import random as rd

def list_of_balls(hat_dict):
'Turns a dictionary into a list, repeating the keys times value'
for keys in hat_dict:
balls_list = []
num_balls = hat_dict[keys]
colour_name = keys
for balls in range(num_balls):
balls_list.append(colour_name)

def dict_of_balls(list):
'Turns a list into a dictionary, keys are the elements and values are the times they are repeated in the list'
final_dict = {}
for balls in list:
ball_number = list.count(balls)
final_dict.update({balls:ball_number})
return final_dict

class Hat:
def __init__(self, hats={}):

self.hats = dict(hats)
# self.content = list(self.hats.keys())
self.content = []
self.total_number_balls = sum(self.hats.values())
self.list_keys = list(self.hats.keys())
for keys in self.hats:
num_balls = self.hats[keys]
colour_name = keys
for balls in range(num_balls):
self.content.append(colour_name)

def draw (self,num_balls):
#_______Remove balls at random from the hat
# random_ball = rd.choice(content_copy)
Total_quantity = self.total_number_balls
content_copy = self.content.copy()
content_copy_length = len(content_copy)
random_balls_list = []

for draws in range(num_balls):
if num_balls > content_copy_length:
return 'Balls returned'
# content_copy.pop(random_ball)
random_balls_list.append(rd.choice(content_copy))

return random_balls_list

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

for trials in range(num_experiments):
draws = Hat.draw(num_balls=num_balls_drawn)
draws_dict = dict_of_balls(draws)
total_trials = 0
probability_result = 0
for keys in draws_dict:
if expected_balls.keys():
return probability_result
``````

This is the solution I came up with:

``````def experiment (Hat,num_balls_drawn,num_experiments,expected_balls):

for trials in range(num_experiments):
draws = Hat.draw(num_balls=num_balls_drawn)
draws_dict = dict_of_balls(draws)
total_trials = 0
probability_result = 0
for keys in expected_balls:
expected_value = expected_balls.get(keys)
draw_value = draws.count(keys)
if (keys in draws) and (expected_value <= draw_value):

total_trials +=1
probability_result = total_trials / num_experiments
return probability_result
``````