在 Python 2.7 中将不公平硬币转换为公平硬币

convert an unfair coin into a fair coin in Python 2.7

使用Python 2.7。假设我有一个不公平的硬币,我想用下面的方式把它变成一个公平的硬币,

  1. 不公平硬币产生正面的概率相等;
  2. 抛出不公平的硬币,只接受正面;
  3. 当出现一个正面时,将其视为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. 掷硬币两次。
  2. 如果两次抛掷相同(正面-正面或反面-反面),重复步骤 1。
  3. 如果抛出正面反面,则将抛掷计为正面。如果掷出正面反面,则算反面。

在 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

elifelse 块可以简化为:

    else:
        return coin1

避免递归调用的@Barmar 答案的替代实现(即使它可能无害)

def fairCoin():
    coin1 = 0
    coin2 = 0
    while coin1 == coin2:
        coin1 = unfairCoin()
        coin2 = unfairCoin()
    return coin1