1

使用 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)])
4

2 回答 2

3

从有偏见的硬币中获得公平的抛硬币解释了一种将有偏见的硬币变成公平硬币的简单算法:

  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
于 2016-10-13T05:51:08.610 回答
2

@Barmar 的答案的另一种实现,可以避免递归调用(即使它可能是无害的)

def fairCoin():
    coin1 = 0
    coin2 = 0
    while coin1 == coin2:
        coin1 = unfairCoin()
        coin2 = unfairCoin()
    return coin1
于 2016-10-13T06:45:21.233 回答