给定一个具有未知偏差的硬币,我如何才能尽可能有效地生成以伯努利分布的概率为0.5的变量?也就是说,使用每个生成的变量的最小翻转次数。
给定一个具有未知偏差的硬币,我如何才能尽可能有效地生成以伯努利分布的概率为0.5的变量?也就是说,使用每个生成的变量的最小翻转次数。
Answers:
这是一个众所周知的问题,在这里和stackoverflow中已经讨论了几个不错的解决方案(似乎我无法发布多个链接,但是快速的Google搜索为您提供了一些有趣的条目)。看一下维基百科条目
http://en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coin
我不确定如何有效地概括这些术语,但是只要总数和成功总数等于都可以,我们就可以停止,因为我们可以划分不同的我们可以将和分为两组等概率的排序,每组分别对应于不同的输出标签。我们需要注意,尚未对这些元素停止操作,即,没有元素具有长度为且前缀为成功元素,使得为偶数。我不确定如何将其转换为预期的翻转次数。Ť
为了显示:
我们可以在TH或HT停下来,因为它们的概率相等。沿着Pascal的三角形向下移动,下一个偶数项位于第四行:4、6、4。这意味着如果出现一个磁头,我们可以在滚动后停止,因为我们可以创建两部分匹配:HHHT和HHTH,技术上来说是HTHH尽管我们已经为此停止了。同样,产生与TTHH匹配的HHTT(其余的,在到达它们之前我们已经停止了)。
对于,所有序列均已停止前缀。在处,它变得更加有趣,我们将FFFFTTFT与FFFFTTTF相匹配。
对于8次后的,如果我们停止了,则没有停止的机会是并且具有预期的数。对于我们保持滚动对直到它们不同的解决方案,如果我们停止滚动,则停止的机会是和预期的滚动数。通过递归,预期翻转的上限给出的算法为。
我编写了一个Python程序以打印出停止点:
import scipy.misc
from collections import defaultdict
bins = defaultdict(list)
def go(depth, seq=[], k=0):
n = len(seq)
if scipy.misc.comb(n, k, True) % 2 == 0:
bins[(n,k)].append("".join("T" if x else "F"
for x in seq))
return
if n < depth:
for i in range(2):
seq.append(i)
go(depth, seq, k+i)
seq.pop()
go(8)
for key, value in sorted(bins.items()):
for i, v in enumerate(value):
print(v, "->", "F" if i < len(value) // 2 else "T")
print()
印刷品:
FT -> F
TF -> T
FFFT -> F
FFTF -> T
FFTT -> F
TTFF -> T
TTFT -> F
TTTF -> T
FFFFFT -> F
FFFFTF -> T
TTTTFT -> F
TTTTTF -> T
FFFFFFFT -> F
FFFFFFTF -> T
FFFFFFTT -> F
FFFFTTFF -> T
FFFFTTFT -> F
FFFFTTTF -> T
FFFFTTTT -> F
TTTTFFFF -> T
TTTTFFFT -> F
TTTTFFTF -> T
TTTTFFTT -> F
TTTTTTFF -> T
TTTTTTFT -> F
TTTTTTTF -> T