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 m
probability-theory
randomness
sampling
probability_guy
fonte
fonte
Respostas:
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 .n 2n m m 6m<2n 6m n
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 .n m−1
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
obtido com as fórmulas: .
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 = 8 n = 13 n = 13
fonte
O que você pode fazer é empregar um método chamado amostragem por rejeição :
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-668 eu . Portanto, esse método é eficiente na prática.( 1 - 68)eu= 14eu
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.0 0 7
@Emanuele Paolini explica como você pode reduzir o número de rerolls, se precisar de várias rolagens de dados.
fonte
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.
fonte
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á.
fonte
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:
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.
fonte
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.
fonte
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.
fonte
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.
fonte
Infelizmente, não se pode (fielmente) simular um dado (justo) usando (sequências de) moedas justas.
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).
fonte