Como simular um dado dado uma moeda justa

21

Suponha que você receba uma moeda justa e gostaria de simular a distribuição de probabilidade de lançar repetidamente um dado justo (de seis lados). Minha idéia inicial é que precisamos escolher números inteiros adequados , de modo que . Então, depois de lançar a moeda vezes, mapeamos o número codificado pela cadeia de bits de comprimento k para as saídas da matriz, dividindo o intervalo em 6 intervalos cada de comprimento . No entanto, isso não é possível, pois tem dois como seu único fator principal, mas os fatores primos de incluem três. Deve haver outra maneira simples de fazer isso, certo?2 k = 6 m k [ 0 , 2 k - 1 ] m 2 k 6 mk,m2k=6mk[0,2k1]m2k6m

probability_guy
fonte
Veja esta pergunta em que o problema é tratado de uma maneira mais geral.
Raphael
Aqui está um artigo sobre o assunto . Explica como usar a amostragem por rejeição e como reutilizar os bits "desperdiçados" para acelerar outros rolos.
precisa saber é o seguinte

Respostas:

12

Para ter um método um pouco mais eficiente do que o indicado por @FrankW, mas usando a mesma idéia, você pode trocar sua moeda vezes para obter um número abaixo de 2 n . Em seguida, interprete isso como um lote de m die flips, onde m é o maior número para que 6 m < 2 n (como já foi dito, a igualdade nunca se mantém aqui). Se você obtiver um número maior ou igual a 6 m, deverá rejeitar o valor e repetir todos os n movimentos .n2nmm6m<2n6mn

Você pode implementar uma função que retorna um único golpe de matriz, fazendo moeda e, em seguida, armazena em cache o resultado para as seguintes solicitações de golpe de m - 1 a seguir .nm1

O ponto interessante é que alguns valores de são melhores que outros porque têm uma menor taxa de rejeição. Aqui está uma lista de bons valores (ou seja, valores com menor taxa de rejeição que os anteriores):n

n m r
3 1 0.25
8 3 0.15625
13 5 0.05078125
44 17 0.0378308072686
75 29 0.0247036782182
106 41 0.0113974522704
243 94 0.00933096248381
380 147 0.00726015308463
517 200 0.00518501504347
654 253 0.00310553931213
791 306 0.00102171682348

obtido com as fórmulas: .

m=nlog32r=13m2n

A primeira linha corresponde à resposta de @FrankW com uma taxa de rejeição de 25%. Os seguintes números são agradáveis: e n = 13 podem ambos ser mantidos em um número inteiro variável estática única. Em particular, a taxa de rejeição de n = 13 é de apenas 5%, o que é uma melhora sensata em relação a 25% e faz disso um bom candidato para uma possível implementação.n=8n=13n=13

Emanuele Paolini
fonte
Você não precisa de 6 ^ m, 6 * m é suficiente. Portanto, você pode usar 5 jogadas para obter um número de 5 bits, rejeitando apenas 1/16 casos.
Taemyr 19/08/14
A taxa de rejeição de 5% para 13 lançamentos é horrível, quando comparada a 25% para 3 lançamentos. Porque 25% para 3 lançamentos rejeitará apenas 4 vezes (ou seja, gaste mais de 12 lançamentos) em 0,390625% dos casos.
Taemyr 19/08/14
@ Taemyr, um número de 5 bits pode representar 32 valores diferentes, o que permite representar um único dado (porque dois dados têm 36 possibilidades). Assim, apenas 6/32 valores são aceitáveis com uma taxa de rejeição de 27/32 = 84%
Emanuele Paolini
@ Taemyr: uma taxa de rejeição de em n arremessos significa que, em média, cada lote de n arremessos é rejeitado com probabilidade r . Portanto, em média, cada sorteio é rejeitado com a mesma taxa r (não depende de n ). rnnrrn
Emanuele Paolini
Sim. E, usando o método de FrankW que tem uma taxa de rejeição de 25% para um lote de 3 lançamentos, você teria uma probabilidade de 1-0.00390625 para aceitar o mais tardar no quarto lote.
precisa saber é
29

O que você pode fazer é empregar um método chamado amostragem por rejeição :

  • Jogue a moeda 3 vezes e interprete cada jogada como um pouco (0 ou 1).
  • Concatene os 3 bits, fornecendo um número binário em .[0,7]
  • Se o número estiver em , tome-o como um rolo de dado.[1,6]
  • Caso contrário, ou seja, se o resultado for ou 7 , repita os movimentos.07

Desde dos resultados possíveis levam ao término de cada conjunto, a probabilidade de precisar de mais delconjuntos de flips para obter uma rolagem é(1-668l . Portanto, esse método é eficiente na prática.(168)l=14l

Melhorias:

@ A resposta de Angel indica que o número de moedas vira em cada conjunto, mas o primeiro pode ser reduzido de 3 para 2, usando a distinção entre e 7 como o primeiro bit para o próximo conjunto.07

@Emanuele Paolini explica como você pode reduzir o número de rerolls, se precisar de várias rolagens de dados.

FrankW
fonte
Esse método não daria maior tendência central que um verdadeiro d6 daria?
RedButton #
3
@ Red_Shadow Não. Note que você não adiciona os lançamentos de moedas (três não seriam suficientes, então), mas escolhe cada bit em um número binário de bits por moeda. Assim, você faz uma amostragem uniforme de [ 0..2 k - 1 ] e rejeita números que não estão no intervalo de destino; isso só pode gerar uma distribuição uniforme no intervalo de destino. k[0..2k1]
Raphael
Se você é esperto com o intervalo rejeitado, neste caso é fácil usá-lo para reduzir o número de lançamentos de moedas necessários no caso de rejeição.
Mooing Duck
@MooingDuck você pode decidir se deseja descartar o resultado depois de 2 lances: se é 0,0 0,1 ou 1,0 em seguida, atirar novamente para o último bit de outra maneira começar de novo
catraca aberração
1
@NikosM. A probabilidade de levar mais do que passos está diminuindo exponencialmente para zero, então a resposta não faz uma afirmação errada: é eficiente na prática e, de fato, é amplamente utilizado. (Para distribuições mais complicadas, muitas vezes é o único método conhecido Em tudo..)k
Raphael
7

Uma alternativa à amostragem por rejeição (conforme descrito na resposta de FrankW ) é usar um algoritmo de escala, que leva em conta uma resposta de [7,8] como se fosse outra moeda lançada.

Há uma explicação muito detalhada em mathforum.org , incluindo o algoritmo ( NextBit()seria lançar sua moeda).

O argumento para jogar um dado com uma moeda justa (amostragem 2 → 6) é mais fácil do que o algoritmo genérico. Você apenas assume uma falha (7 ou 8) como outra entrada de moeda e executa mais dois lançamentos.

Anjo
fonte
2

Outra abordagem para simular um rolo de um dN usando um dM (no caso da pergunta específica feita a um d6 usando um d2) é particionar o intervalo [0, 1) em N intervalos iguais de comprimento 1 / N, [0, 1 / N), [1 / N, 2 / N), ..., [(N-1) / N, N).

Use o dM para gerar uma fração base-M, 0.bbbb ..., em [0, 1). Se isso ocorrer em [(i-1) / N, i / N), tome i como o rolo do dN. Observe que você só precisa gerar dígitos base-M suficientes da fração para determinar em que intervalo está.

tzs
fonte
A condição de término precisa ser mais precisa. Se eu jogar a moeda uma vez, terminarei com a fração binária 0,0 ou 0,1 (isto é, ½), ambas as quais caem em um intervalo (correspondente a 0 e 3, respectivamente, neste caso). Você precisa considerar a fração gerada como um intervalo e parar quando o intervalo inteiro estiver dentro de um único intervalo. Tenho certeza de que foi isso que você pretendeu, mas não acho claro.
rici
1

Uma explicação possivelmente mais simples de amostragem de rejeição aprimorada.

Estou dando essa explicação, pois espero que possa ajudar a simplificar o entendimento ou a análise de probabilidades em algumas situações.

FrankW sugere o uso de amostragem por rejeição, lançando a moeda três vezes, mantendo o resultado se estiver na faixa certa ou repetindo os três lançamentos caso contrário, até o sucesso.

Ángel sugere salvar um flip em cada tentativa, substituindo-o pela opção binária restante dos dois valores não utilizados do conjunto anterior de três.

Isso significa realmente que um pouco de informação foi produzido nos três primeiros lançamentos, que não precisou ser produzido. Mais precisamente, você deve jogar a moeda apenas duas vezes para saber se o conjunto atual de lançamentos será bem-sucedido.

Saber se o conjunto atual de flip será bem-sucedido é a única probabilidade que importa , pois a interpretação de um conjunto bem-sucedido de flip é independente de probabilidade. E isso pode ser conhecido antes que todos os lançamentos sejam concluídos para esse conjunto.

Isso pode ser conseguido de pelo menos duas maneiras, ou mais precisamente em duas interpretações diferentes dos lançamentos. Pode haver outros.

O agrupamento resulta em pares

A idéia é considerar apenas três valores (1,2), (3,4) e (5,6) representados por quaisquer três configurações de flip duplo, como TT, TH, HT. Em seguida, você pode aplicar a amostragem de rejeição com lançamentos duplos, repetindo sempre que obtiver a configuração de falha HH.

Depois de obter uma das três configurações bem-sucedidas, basta jogar a moeda mais uma vez para decidir se deve pegar o primeiro ou o segundo valor do par correspondente.

Detecção precoce de falha do flip-set

A idéia é usar uma leitura ligeiramente diferente da configuração de três flip. Se Head e Tail são interpretados como 1 e 0, uma configuração deve corresponder à interpretação binária mais uma. Ou seja, TTT (ou seja, 000) corresponde a 1, HTH (ou seja, 101) corresponde a 6, HHT (ou seja, 110) e HHH (ou seja, 111) corresponde a 7 e 8, ou qualquer coisa fora [1,6].

Então, sabemos que o flip-set está tendo sucesso ou falhando apenas com os dois primeiros flips. Se eles produzem HH, o flip set falha independentemente do último flip. Portanto, pode ser pulado.

Acho que a detecção precoce sempre pode ser usada como explicação, mas, dependendo do número de faces em seus dados simulados, a detecção de falhas pode ocorrer após um número variável de movimentos.

Por exemplo, para um dado de 10 faces, você precisa, em princípio, de um conjunto de 4 lançamentos, com 6 configurações correspondentes à falha. O truque é ter todas as configurações de falha na extremidade superior da sequência de valores binários da seguinte maneira:

TTTT  0000   1
HTTT  1000   9
HTTH  1001  10
HTHT  1001  11
HTHH  1011  12
HHTT  1100  13
HHHH  1111  16

Configurações bem-sucedidas correspondem ao intervalo [1, 10] e falhas no intervalo [11,16].

Então você falha quando os dois primeiros movimentos dão HH, ou quando os três primeiros dão HTH, sem ter que tentar os movimentos ausentes do conjunto.

Se você não falhar, basta encerrar o conjunto de lançamentos.

babou
fonte
1

Existem duas abordagens bem conhecidas para isso. Um é "amostragem por rejeição". Por exemplo, use três bits para selecionar um dos seis valores, tentando novamente para as duas amostras extras. Ou use 14 bits (valores 8192) para selecionar 5 valores de 1 a 6 (7776 possibilidades), tentando novamente em 13 dos 256 casos.

O outro está usando a parte de descompressão de um algoritmo de compressão / descompressão: com a codificação aritmética, uma sequência de valores aleatórios de 1 a 6 pode ser compactada com quase nenhuma redundância. Gere a sequência compactada aleatoriamente e descompacte-a. Isso é muito mais complicado, mas praticamente não exige números aleatórios adicionais.

gnasher729
fonte
0

Desculpe antecipadamente se a explicação é supérflua. Eu não tinha certeza de quantos detalhes entrar ou de quão fácil era o conceito de entender.

Digamos que você tenha três moedas (moedas justas). Se você atribuir um valor incrementalmente a cada lado de cada moeda, terá seis valores.

Assim: Na primeira moeda, cara é 1 e coroa é 2. Na segunda moeda, cara é 3 e coroa é 4. Na terceira moeda, cara é 5 e coroa é 6.

Ao lançar as moedas, você terá um conjunto de três números, o seu conjunto atual. Agora, seu conjunto atual se tornará o conjunto anterior e você repetirá o processo para obter um novo conjunto de três números.

Continue fazendo isso até que um e apenas um número corresponda do seu conjunto atual ao anterior. Esse é o seu número.

Então, se você tem [cara, coroa, cara] para o conjunto atual, isso seria [1, 4, 5]. Agora você as vira novamente e seu conjunto atual é [2, 4, 5]. Duas partidas. Nada de bom. Tente de novo. Você recebe [2, 3, 6]. Apenas uma partida. Seu número é dois.

Haverá uma chance igual de que qualquer número apareça, mas não é particularmente econômico, pois há apenas uma alteração de 3/32 de que qualquer par de conjuntos será bem-sucedido (apenas uma correspondência). Então, em média, o algoritmo teria que repetir cerca de dez vezes. Além disso, não é facilmente generalizável para dados com números ímpares.

No mínimo, talvez seja alimento para reflexão. Pergunta muito interessante.

Dan D
fonte
4
lognn12n2n/2n
0

Eu jogava a moeda três vezes e interpretava o resultado como um número binário, rejeitando resultados fora de alcance.

Por exemplo, permita que as cabeças sejam 1 e as caudas sejam 0. Se você o girasse três vezes e obtivesse cabeças, caudas, cabeças, você teria o binário 101, que é 5 em decimal. HHT = 110b = 6. TTT = 000b = 0 e HHH = 111b = 7, ambos fora do intervalo e seriam rejeitados, e você refletiria em todos os dígitos.

Sohcahtoa82
fonte
1
Essa é apenas a resposta do Frank.
Raphael
2
@Raphael Na verdade, um subconjunto estrito da resposta de Frank , uma vez que Frank aborda o tempo de execução esperado.
David Richerby
0

Infelizmente, não se pode (fielmente) simular um dado (justo) usando (sequências de) moedas justas.

62

Mas pode-se fazer isso com uma "moeda tripla" justa (se esse termo puder ser usado). Ou seja, uma moeda com 3 resultados. E uma simples moeda de 2, para que o espaço conjunto dessas 2 moedas corresponda exatamente ao espaço do evento do dado.

A amostragem por rejeição (como mencionado em algumas respostas) pode fornecer uma simulação aproximada . Mas ainda haverá uma quantidade de erro ou incompatibilidade de probabilidades (em tempo finito). Portanto, se alguém quiser realmente corresponder aos espaços de eventos desses 2 sistemas, haverá casos em que não funcionará.

Na simulação probabilística (da qual a amostragem por rejeição é um exemplo), as seqüências típicas geradas realmente exibem as probabilidades elementares relativas (neste caso, o espaço de eventos de um dado). No entanto (como mencionado nos comentários), cada uma dessas seqüências típicas pode conter sub sequências arbitrariamente longas com exatamente os mesmos resultados. Isso significa que, para usar a amostragem por rejeição (em alguns casos), isso pode demorar arbitrariamente ou a distribuição gerada será enviesada (ou seja, não é um dado justo), devido à super-representação ou sub-representação de algumas partes do seu espaço de evento . se não fosse esse o caso, seria possível um algoritmo determinístico que correspondesse exatamente aos espaços de eventos de um dado e uma moeda (que não correspondam por dimensionalidade).

Nikos M.
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Gilles 'SO- stop be evil'
@Gilles, muito ruim voto negativo ainda está aqui, apesar de todas as explicações e conversando (quanto à exactidão) que prosseguiu: p
Nikos M.