【发布时间】:2016-10-13 05:38:30
【问题描述】:
使用 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)])
【问题讨论】:
-
谷歌“把不公平的抛硬币变成公平的”,你会发现很多描述相同算法的论文。
-
不,我只是通过谷歌搜索找到的。
-
此算法仅返回一个交替 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