# Probability Calculator test failure

Hello everyone and a very Happy New Year!

So I’ve been trying to code the probability calculator and keep getting an error in the third test.

I’m pretty sure it’s with my draw() method.
But I’ve literally gone through all of the posts about it on this forum and tried tinkering with my code but to no avail.

Would appreciate any help.

Here’s the code in an embed:

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

class Hat:

##
###
def __init__(self, **col_balls):
### creates list to be written into
self.contents = []
### loop runs through each key (named after a color) in col_balls dictionary
for color in col_balls:
### loop runs from 0 to the number of balls for each color
for number in range(col_balls[color]):
### appends list with color
self.contents.append(color)

##

## Defines method to draw balls
### defines method; accepts number of balls to be drawn as an argument
def draw(self, no):
### creates list to be written into
drawn = []
### checks if number of balls to be drawn is more than the number of given balls
if no > len(self.contents):
### stores entire list of given balls as drawn
drawn = copy.deepcopy(self.contents)
### clears initial list of given balls
self.contents.clear
### returns entire list of given balls
return drawn
else:
for i in range(no):
### selects the index of ball to be picked
picked = random.choice(range(0, len(self.contents)))
### adds ball to the list of drawn balls
drawn.append(self.contents[picked])
### removes ball from initial list
self.contents.pop(picked)
### return the drawn balls
return drawn

##

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

### creates counter for number of successful experiments
count = 0

### loop runs through the designated number of times the experiment is to be conducted
for i in range(0, num_experiments):

### creates copies to work on of initial list so it is the same after each experiment
hat_copy = copy.deepcopy(hat)
### creates copy of list of expected balls to be drawn so it is the same after each experiment
expected_copy = copy.deepcopy(expected_balls)

### computes and stores list of drawn balls
colors_drawn = hat_copy.draw(num_balls_drawn)

### loop runs through each ball (designated by color-name) in list of drawn balls
for color in colors_drawn:
### checks if the ball-color is in the list of expected balls
if color in expected_copy == True:
### the number of balls of that color in the list of expected balls is deducted by one
expected_copy[color] = expected_copy[color] - 1
else:
pass

### checks if all the values corresponding to each key in the list of expected balls is zero
if(all(x <= 0 for x in expected_copy.values())):
### adds one to the counter for successful experiments
count = count + 1

return count/num_experiments
``````

And here’s the error:

``````Probability: 0.0
..F
======================================================================
FAIL: test_prob_experiment (test_module.UnitTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/runner/shirshodasgupta-probability-calculator/test_module.py", line 27, in test_prob_experiment
self.assertAlmostEqual(actual, expected, delta = 0.01, msg = 'Expected experiment method to return a different probability.')
AssertionError: 0.0 != 0.272 within 0.01 delta (0.272 difference) : Expected experiment method to return a different probability.

----------------------------------------------------------------------
Ran 3 tests in 0.181s

FAILED (failures=1)
``````

Log your results from your experiment since the draw method is at least nominally working since it passes its tests. Since your reported probability is zero, that means you are classifying all draws as failures. So, log the drawn balls, the expected balls, and the pass/fail status to find the cases where the code has misclassified an experiment.

1 Like

Aah, found it!

The draws were not being added because of this bit:

``````for color in colors_drawn:
if color in expected_copy == True:
expected_copy[color] = expected_copy[color] - 1

``````

Wrote it like this and it seems to work now:

`````` if (color in expected_copy) == True:
``````

Thanks!

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.