【问题标题】:convert an unfair coin into a fair coin in Python 2.7在 Python 2.7 中将不公平的硬币转换为公平的硬币
【发布时间】:2016-10-13 05:38:30
【问题描述】:

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

【问题讨论】:

  • 谷歌“把不公平的抛硬币变成公平的”,你会发现很多描述相同算法的论文。
  • 不,我只是通过谷歌搜索找到的。
  • 此算法仅返回一个交替 1、0、1、0、1、0、... FWIW 的非随机序列,Bill the Lizard 是著名的 Stack Overflow 成员和前钻石版主。
  • 嗯,Billk the Lizard 给出的算法是执行此操作的标准方法。正如比尔的页面所提到的,这个算法最初是由冯诺依曼发表的,但它已经被重新发现了很多次(包括我:))。要了解有关此重要主题的更多信息,请参阅Whitening transformation

标签: python algorithm python-2.7 probability coin-flipping


【解决方案1】:

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,我阅读了这篇文章并理解翻转两次或更多次(并结合 0/1 结果)是一种解决方案。我的问题是,是否可以通过我提到的新方法来解决问题,翻转并只保留 1?如果不是,我的方法有什么问题?
  • 我不知道。这似乎更像是一道数学题,而不是编程题。
  • @LinMa math.stackexchange.com 是询问您的方法的正确地方
  • 我会去那里把你的回复标记为答案,谢谢大家的帮助。
【解决方案2】:

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

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

【讨论】:

  • 谢谢user3386109,我理解你的方法,我的问题是,是否可以通过我提到的新方法解决问题,翻转并只保留1?如果不是,我的方法有什么问题?
  • @LinMa 你的方法不行,因为如果你翻转只保留1,那么你根本没有使用翻转的结果。
  • 感谢user3386109,我认为我利用翻转结果,因为我翻转并得到两个数字0或1,我总是保持1。我认为对于不公平的硬币,产生1的概率总是相同的,对吗?
  • @LinMa 我看你会在math.stackexchange.com上问,所以我让他们解释一下。
  • 不错的user3386109,我完全理解你的方法,只是不知道我的方法有什么问题。让我们在那里讨论数学交流。为您的回复投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
相关资源
最近更新 更多