Reputation: 10139
Using Python 2.7. Suppose I have an unfair coin and I want to turn it into a fair coin using the following way,
Not sure if this method works? Actually I am not quite confident about the method above and also how to use equalCoinHelper()
correctly (I mark my question in my code).
If anyone have any good ideas, it will be great.
from __future__ import print_function
import random
counter = 0
# 0.3 probability return head as 1
# 0.7 probability return tail as 0
def unFairCoin():
if random.random() < 0.3:
return 1
else:
return 0
# probability of generating 1 is equal, so keep 1 only
def equalCoinHelper():
result = 0
while result == 0:
result = unFairCoin()
def equalDistribution():
global counter
# not think about how to leverage this better
equalCoinHelper()
counter += 1
if counter % 2 == 0:
return 1
else:
return 0
if __name__ == "__main__":
# generate 10 random 0/1 with equal probability
print ([equalDistribution() for _ in range(10)])
Upvotes: 2
Views: 1768
Reputation: 780714
Getting a Fair Toss From a Biased Coin explains a simple algorithm for turning a biased coin into a fair coin:
In Python this would be:
def fairCoin():
coin1 = unfairCoin()
coin2 = unfairCoin()
if coin1 == coin2:
return fairCoin() # both are the same, so repeat it
elif coin1 == 1 and coin2 == 0:
return 1
else:
return 0
The elif
and else
blocks can be simplified to just:
else:
return coin1
Upvotes: 4
Reputation: 34829
An alternative implementation of @Barmar's answer that avoids the recursive call (even though it may be harmless)
def fairCoin():
coin1 = 0
coin2 = 0
while coin1 == coin2:
coin1 = unfairCoin()
coin2 = unfairCoin()
return coin1
Upvotes: 2