naman - 1 year ago 85
Python Question

# Monte-Carlo Simulation of expected tosses for two consecutive heads in python

The expected number of tosses to get two heads in a row is 6. However on executing the below simulation of multiple runs of this experiment, I get a different plot from that expected. Could you help me identify the error in the logic?
Thanks

Code to simulate tosses and check at when two consecutive heads are encountered repeated 10000 times:

``````import random
def toss():
return random.randint(0, 1)

expected_tosses=list()
for test in range(10000):
a=toss()
for i in range(2,100):
b=toss()
if a and b:
expected_tosses.append(i)
break
a=b

import matplotlib.pyplot as plt
plt.hist(expected_tosses, range(1,10))
plt.show()
``````

### A: Some subtle error in the code

You are changing the statistics by limiting your upper-loop. Use an infinite loop instead.

The code then looks like the following which should be more precise:

``````import random
def toss():
return random.randint(0, 1)

expected_tosses=list()
for test in range(10000):
a=toss()

i = 2
while True:
b=toss()
if a and b:
expected_tosses.append(i)
break
a=b
i+=1

import matplotlib.pyplot as plt
print(sum(expected_tosses) / float(len(expected_tosses)))
plt.hist(expected_tosses, range(1,10))
plt.show()
``````

### B: Interpretation of the output

The results are okay!

I introduced a calculation of the mean of tosses needed (in the code above) and print it out. You will see, that the means looks like what you expected!

Some example output (we don't use a seed so results will differ each run):

``````5.9941
``````

Just to be clear: The mean does not tell you that much about the shape of the histogram. Maybe this is the source of your confusion (having a near-minimum at 6 in your plot).

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download