Dada uma moeda com viés desconhecido, gere variáveis ​​a partir de uma moeda justa com eficiência

10

Dada uma moeda com viés desconhecido p , como posso gerar variáveis ​​- tão eficientemente quanto possível - que são distribuídas por Bernoulli com probabilidade 0,5? Ou seja, usando o número mínimo de inversões por variável gerada.

Neil G
fonte
3
Uma solução simples é jogar a moeda duas vezes: se é HT mapeá-lo com cara, se é TH mapeá-lo com coroa. Caso contrário, repita o experimento até que um desses dois seja alcançado.
cardeal
11
@ cardinal: Legal! Por que não adicionar uma resposta?
Neil G
2
@Glen_b: Ok, mas você pode fazer isso com o número mínimo de inversões por variável gerada?
Neil G
3
@ MichaelLugo: Eu diria que definitivamente depende da . :-) Se p = 1 / 2 sabemos que podemos fazê-lo em um flip. Se p = 1 / 4 sabemos que podemos fazê-lo em dois e, sabemos que este é o ideal em ambos os casos. A resposta deve estar relacionada à entropia H ( p ) . Se não sabemos nada sobre p além de p ( 0 , 1 )pp=1/2p=1/4H(p)pp(0,1), suspeito que um resultado simples da teoria dos jogos trará algo próximo ao esquema no meu primeiro comentário como sendo "ideal" de maneira apropriada.
cardeal
4
Olá Giorgio1927, e bem-vindo ao site! Adicione a tag "auto-estudo" a esta pergunta, pois permite que as pessoas vejam que devem orientá-lo para a resposta, em vez de simplesmente fornecer uma.
jbowman

Respostas:

6

Esse é um problema conhecido com várias soluções legais que foram discutidas aqui e no stackoverflow (parece que não posso postar mais de um link, mas uma rápida pesquisa no Google fornece algumas entradas interessantes). Dê uma olhada na entrada da Wikipedia

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

Carlos Fuentes
fonte
Desculpe, eu modifiquei a questão para que ele não é tão facilmente Google-able ...
Neil G
Para as pessoas que pensam em responder à pergunta, observe que essa resposta não é ideal para a minha pergunta editada.
Neil G
3

Acredito que esse é um problema clássico, atribuído originalmente a von Neumann. Uma solução é continuar jogando a moeda em pares até que os pares sejam diferentes e depois adiar para o resultado da primeira moeda no par.

(Xi,Yi)iXiYipP(Xi=H|XiYi)=P(Xi=T|XiYi)P(Xi=H|XiYi)=1/2XiYi(H,T)(T,H)

Empiricamente, o tempo de espera até que um par tão desigual seja

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

p

Alex R.
fonte
2

nt(nt)ntnt(nt)

Ilustrar:

Podemos parar em TH ou HT, pois estes têm igual probabilidade. Movendo-se para baixo do triângulo de Pascal, os próximos termos pares estão na quarta linha: 4, 6, 4. O que significa que podemos parar após as jogadas se uma cabeça subir, pois podemos criar uma correspondência bipartida: HHHT com HHTH e tecnicamente HTHH com THHH, embora já tivéssemos parado para isso. Da mesma forma, produz o HHTT correspondente ao TTHH (o resto, já teríamos parado antes de alcançá-los).(42)

Para , todas as sequências pararam prefixos. Fica um pouco mais interessante em onde combinamos FFFFTTFT com FFFFTTTF.(52)(83)

Para após 8 jogadas, a chance de não ter parado é com um número esperado de rolagens se tivermos parado de . Para a solução em que mantemos pares rolantes até que eles diferam, a chance de não ter parado é com um número esperado de rolagens, se tivermos parado de 4. Por recursão, um limite superior nos lançamentos esperados para o algoritmo apresentado é . p=12112853161161281275316=424127<4

Eu escrevi um programa Python para imprimir os pontos de parada:

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()

impressões:

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
Neil G
fonte
Quando é desconhecida, qualquer solução tem de trabalhar para limitar os valores de e . Isso deve deixar claro que a solução do @ Cardinal é ideal. O número esperado de aletas (dado o desconhecido , de curso) é .pp0p1p2/((p(1p))
whuber
@ whuber: Não vejo por que deveria ser o ideal. Minha solução para nos mesmos casos que os dele. No entanto, ele continuará rolando após o terceiro, por exemplo, enquanto é possível parar.
Neil G
Qual é a sua solução? Eu não vejo um descrito aqui. Acho que podemos ter conceitos diferentes da solução do @ Cardinal. Entendo que isso significa "pare sempre que o número de cabeças igual ao número de caudas e mapeie isso para o valor do primeiro resultado na sequência".
whuber
@whuber: Você quer dizer o seguinte: "Uma solução simples é jogar a moeda duas vezes: se for HT mapeá-lo com cara, se for TH mapeá-lo com coroa. Caso contrário, repita o experimento até que um desses dois seja alcançado." Isso não irá parar para o HHTT. Ele espera um par HT ou TH em um índice par.
Neil G
Minha solução é encontrar uma correspondência bipartida de prefixos equiprobáveis ​​(nenhum dos quais é prefixo outro) e associar cada metade da correspondência com cara ou coroa.
Neil G