给定一个具有未知偏差的硬币,可以有效地从一个公平的硬币中生成变量


10

给定一个具有未知偏差的硬币,我如何才能尽可能有效地生成以伯努利分布的概率为0.5的变量?也就是说,使用每个生成的变量的最小翻转次数。p


3
一个简单的解决方案是将硬币翻转两次:如果是,则将其映射为正面;如果是,则将其映射为背面。否则,重复该实验,直到实现这两者之一。HTTH
主教

1
@cardinal:很好!为什么不添加答案?
尼尔·G

2
@Glen_b:好的,但是您能用每个生成的变量的最小翻转次数来做到吗?
Neil G

3
@MichaelLugo:我想说这绝对取决于。:-)如果我们知道我们可以一举完成。如果我们知道可以一分为二,并且知道在两种情况下这都是最佳的。答案应该与熵。如果我们知道任何关于以外,然后我怀疑一个简单博弈论的结果将产生一些接近的方案在我的第一个评论为以适当的方式“最佳”。pp=1/2p=1/4H(p)pp(0,1)
主教

4
您好,Giorgio1927,欢迎光临本站!请在此问题上添加“自学”标签,因为它使人们看到他们应该引导您找到答案,而不仅仅是提供答案。
jbowman

Answers:


6

这是一个众所周知的问题,在这里和stackoverflow中已经讨论了几个不错的解决方案(似乎我无法发布多个链接,但是快速的Google搜索为您提供了一些有趣的条目)。看一下维基百科条目

http://en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coin


抱歉,我修改了问题,以使其不那么容易与Google兼容……
Neil G

对于正在考虑回答问题的人们,请注意,此答案对于我编辑过的问题不是最佳的。
尼尔·G

3

我认为这是一个经典问题,最初应归因于冯·诺伊曼。一种解决方案是保持成对扔硬币直到成对的硬币不同,然后根据成对硬币中的第一个硬币的结果。

明确地让为抛掷的结果,其中为第一个硬币,为第二个硬币。每个硬币的正面概率为。然后由于对称性,,这意味着。要清楚地看到这种对称性,请注意表示结果是或,由于独立性,两者的可能性均相等。(Xi,Yi)iXiYipP(Xi=H|XiYi)=P(Xi=T|XiYi)P(Xi=H|XiYi)=1/2H T T H XiYi(H,T)(T,H)

根据经验,直到这样的不平等对的等待时间是

1/P(XY)=11p2(1p)2=12p(1p),

当接近0或1时,它会爆炸(这是有道理的)。p


2

我不确定如何有效地概括这些术语,但是只要总数和成功总数等于都可以,我们就可以停止,因为我们可以划分不同的我们可以将和分为两组等概率的排序,每组分别对应于不同的输出标签。我们需要注意,尚未对这些元素停止操作,即,没有元素具有长度为且前缀为成功元素,使得为偶数。我不确定如何将其转换为预期的翻转次数。Ťnt(nt)ntnt(nt)

为了显示:

我们可以在TH或HT停下来,因为它们的概率相等。沿着Pascal的三角形向下移动,下一个偶数项位于第四行:4、6、4。这意味着如果出现一个磁头,我们可以在滚动后停止,因为我们可以创建两部分匹配:HHHT和HHTH,技术上来说是HTHH尽管我们已经为此停止了。同样,产生与TTHH匹配的HHTT(其余的,在到达它们之前我们已经停止了)。(42)

对于,所有序列均已停止前缀。在处,它变得更加有趣,我们将FFFFTTFT与FFFFTTTF相匹配。(52)(83)

对于8次后的,如果我们停止了,则没有停止的机会是并且具有预期的数。对于我们保持滚动对直到它们不同的解决方案,如果我们停止滚动,则停止的机会是和预期的滚动数。通过递归,预期翻转的上限给出的算法为。 p=12112853161161281275316=424127<4

我编写了一个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

当未知时,任何解决方案都必须适用于将限制和。这应该清楚表明@Cardinal的解决方案是最佳的。翻转的预期数量(给定的未知当然)是。pp0p1p2/((p(1p))
whuber

@whuber:我不明白为什么它应该是最佳的。在与他相同的所有情况下,我的解决方案都会停止。但是,例如,他将在tthh之后继续滚动,但有可能停止。
尼尔·G

您有什么解决方案?我看不到这里描述的一个。我认为@Cardinal解决方案可能有不同的概念。我理解它的意思是“每当正面的数目等于反面的数目时停止,并将其映射到序列中第一个结果的值”。
ub

@whuber:您的意思是:“一个简单的解决方案是将硬币翻转两次:如果是HT映射到正面,如果是TH映射到背面,否则,重复实验直到完成这两个之一。” 对于HHTT,这不会停止。它等待偶数索引上的HT或TH对。
尼尔·G

我的解决方案是找到等概率前缀(没有一个是另一个前缀)的二分匹配,并将匹配的每半部分与头或尾相关联。
尼尔·G
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.