在 Python 2.7 中将不公平硬币转换为公平硬币
convert an unfair coin into a fair coin in Python 2.7
使用Python 2.7。假设我有一个不公平的硬币,我想用下面的方式把它变成一个公平的硬币,
- 不公平硬币产生正面的概率相等;
- 抛出不公平的硬币,只接受正面;
- 当出现一个正面时,将其视为1(虚拟公平币为正面),当另一个正面出现时,将其视为0(虚拟公平币为尾部),下次出现正面时,将其视为1,下次按0,...,依此类推
不确定这个方法是否有效?其实我对上面的方法以及如何正确使用 equalCoinHelper()
不太有信心(我在我的代码中标记了我的问题)。
如果谁有什么好主意,那就太好了。
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)])
Getting a Fair Toss From a Biased Coin 解释了一个将有偏见的硬币变成公平硬币的简单算法:
- 掷硬币两次。
- 如果两次抛掷相同(正面-正面或反面-反面),重复步骤 1。
- 如果抛出正面反面,则将抛掷计为正面。如果掷出正面反面,则算反面。
在 Python 中将是:
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
elif
和 else
块可以简化为:
else:
return coin1
避免递归调用的@Barmar 答案的替代实现(即使它可能无害)
def fairCoin():
coin1 = 0
coin2 = 0
while coin1 == coin2:
coin1 = unfairCoin()
coin2 = unfairCoin()
return coin1
使用Python 2.7。假设我有一个不公平的硬币,我想用下面的方式把它变成一个公平的硬币,
- 不公平硬币产生正面的概率相等;
- 抛出不公平的硬币,只接受正面;
- 当出现一个正面时,将其视为1(虚拟公平币为正面),当另一个正面出现时,将其视为0(虚拟公平币为尾部),下次出现正面时,将其视为1,下次按0,...,依此类推
不确定这个方法是否有效?其实我对上面的方法以及如何正确使用 equalCoinHelper()
不太有信心(我在我的代码中标记了我的问题)。
如果谁有什么好主意,那就太好了。
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)])
Getting a Fair Toss From a Biased Coin 解释了一个将有偏见的硬币变成公平硬币的简单算法:
- 掷硬币两次。
- 如果两次抛掷相同(正面-正面或反面-反面),重复步骤 1。
- 如果抛出正面反面,则将抛掷计为正面。如果掷出正面反面,则算反面。
在 Python 中将是:
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
elif
和 else
块可以简化为:
else:
return coin1
避免递归调用的@Barmar 答案的替代实现(即使它可能无害)
def fairCoin():
coin1 = 0
coin2 = 0
while coin1 == coin2:
coin1 = unfairCoin()
coin2 = unfairCoin()
return coin1