#### https://www.freecodecamp.org/learn/scientific-computing-with-python/scientific-computing-with-python-projects/probability-calculator ######### prob_calculator.py #####
import copy
import random
class Hat:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
self.contents = []
for key, value in kwargs.items():
for i in range(int(value)):
self.contents.append(key)
self.drawn_all = []
def draw(self, num_balls_drawn):
index_drawn = random.sample(range(len(self.contents)), num_balls_drawn)
drawn = [x for i, x in enumerate(self.contents) if i in index_drawn]
self.drawn_all = self.drawn_all + drawn
self.contents = [x for i, x in enumerate(self.contents) if not i in index_drawn]
if len(self.contents) < num_balls_drawn:
self.contents = self.contents + self.drawn_all
self.drawn_all = []
return drawn
def experiment(hat, expected_balls, num_balls_drawn, num_experiments):
match_all = 0
for i in range(num_experiments):
drawn = hat.draw(num_balls_drawn)
drawn = dict((x,drawn.count(x)) for x in set(drawn))
match = 0
for key in expected_balls:
if key in drawn and drawn[key] >= expected_balls[key]:
match += 1
if match == len(expected_balls):
match_all += 1
return match_all / num_experiments