Hi

I was doing an exercise in the Real Python book. It gave a task of simulating a coin toss "I keep flipping a fair coin until I've seen it land on both heads and tails at least once each – in other words, after I flip the coin the first time, I continue to flip it until I get a different result. On average, how many times will I have to flip the coin total? "

So created the code:

``````from __future__ import division
from random import randint

flips = 0
trials = 10000

for trial in range(0, trials):

first_flip = randint(0,1)
while randint(0,1) == first_flip:
flips += 1
flips += 1

print "Average = ", flips / trials
``````

So this produces an average of 2 which I thought would be right considering a coin is 2 sided.

However the solution is different:

``````from __future__ import division
from random import randint

flips = 0
trials = 10000

for trial in range(0, trials):
flips += 1 # first flip
if randint(0, 1) == 0: # flipped tails on first flip
while randint(0, 1) == 0: # keep flipping tails
flips += 1
flips += 1 # finally flipped heads
else: # otherwise, flipped heads on first flip
while randint(0, 1) == 1: # keep flipping heads
flips += 1
flips += 1 # finally flipped tails

print flips / trials
``````

And this produces an answer of 3.

The only difference I can see is that in my code I don't care whether its head or tails just measure whether its the same as the first flip.

Why are the averages different?

The number of flips on average is first_flip + flips + final_flip = flips + 2:

``````from __future__ import division
from random import randint

flips = 0
trials = 10000

for trial in range(trials):
first_flip = randint(0, 1)
while randint(0, 1) == first_flip:
flips += 1 # flips between

print flips / trials + 2.0 # always the first and last flip also

""" Output:
3.0075
"""
``````

The exact theoretical answer would be counted

``````print sum((1.0/2)**n for n in range(10000)) + 1
``````

as there is the first try and 0...infinity throws after first, continuation chance always halfing. (10000 arbitrary "big enough" number for the number to reduce to almost zero)

Thanks

``````while randint(0, 1) == first_flip:
``````

makes much more sense thanks. And i forgot to add the first and last flip. It's good too see I wasn't too far out of the ballpark. When I saw the other solution was so different I thought I had stuffed it.