Desenhe números inteiros independentemente e uniformemente aleatoriamente de 1 a usando d6?


18

Desejo desenhar números inteiros de 1 a algum específico , rolando um número razoável de dados de seis lados (d6). Uma boa resposta irá explicar por que seu método produz números inteiros uniformes e independentes .N

Como exemplo ilustrativo, seria útil explicar como uma solução funciona para o caso de .N=150

Além disso, desejo que o procedimento seja o mais eficiente possível: role o menor número de d6 em média para cada número gerado.

Conversões de senário para decimal são permitidas.


Esta pergunta foi inspirada por este segmento Meta .

Respostas:


12

O conjunto de resultados identificáveis ​​distintos em rolos independentes de um dado com faces possui elementos. Quando o dado é justo, isso significa que cada resultado de uma jogada tem probabilidade independência significa que cada um desses resultados terá probabilidade isto é, eles têm uma distribuição uniformeΩ(d,n)nd=6dn1/d(1/d)n:Pd,n.

Suponha que você tenha planejado algum procedimento que determine resultados de um dado de lado - ou seja, um elemento de - ou então relate falha (o que significa que você terá que repita para obter um resultado). Isso é,tmc(=150)Ω(c,m)

t:Ω(d,n)→Ω(c,m)∪{Failure}.

Seja a probabilidade resulta em falha e observe que é algum múltiplo integral de digamosFtFd−n,

F=Pr(t(ω)=Failure)=NFd−n.

(Para referência futura, observe que o número esperado de vezes que deve ser chamado antes de não falhar é )t1/(1−F).

A exigência de que esses resultados em ser uniforme e independente condicional em não relatar meios de falha que conservas probabilidade no sentido de que para cada eventoΩ(c,m)t t Um ⊂ Ω ( c , m ) ,ttA⊂Ω(c,m),

(1)Pd,n(t∗A)1−F=Pc,m(A)

Onde

t∗(A)={ω∈Ω∣t(ω)∈A}

é o conjunto de dados que o procedimento atribui ao eventotA.

Considere um evento atômico , que deve ter probabilidadeDeixe (os dados associados a ) possuem elementos. torna-seA={η}⊂Ω(c,m)c−m.t∗(A)ηNη(1)

(2)Nηd−n1−NFd−n=Pd,n(t∗A)1−F=Pc,m(A)=c−m.

É imediato que os sejam todos iguais a um número inteiroNηN. Resta apenas encontrar os procedimentos mais eficientes O número esperado de falhas não por rolo do sided die sejat.cc

1m(1−F).

Existem duas implicações imediatas e óbvias. Uma é que, se podemos manter pequeno à medida que cresce, o efeito de relatar uma falha é assintoticamente zero. A outra é que, para qualquer dado (o número de jogadas do dado do lado para simular), queremos tornar o menor possível.FmmcF

Vamos dar uma olhada em limpando os denominadores:(2)

Ncm=dn−NF>0.

Isso torna óbvio que, em um determinado contexto (determinado por ), seja o menor possível, tornando igual ao maior múltiplo de que seja menor ou igual a Podemos escrever isso em termos da maior função inteira (ou "piso") comoc,d,n,mFdn−NFcmdn.⌊∗⌋

N=⌊dncm⌋.

Por fim, fica claro que deve ser o menor possível para obter maior eficiência, pois mede a redundância em . Especificamente, o número esperado de rolos da matriz do lado necessário para produzir um rolo da matriz do lado éNt d ctdc

N×nm×11−F.

Assim, nossa busca por procedimentos de alta eficiência deve focar nos casos em que é igual a, ou apenas pouco maior que, algum poderdncm.

A análise termina mostrando que, para dados de e há uma sequência de múltiplos para a qual essa abordagem se aproxima da eficiência perfeita. Isso equivale a encontrar para o qual aproxima de no limite (garantindo automaticamente ). Uma dessas seqüências é obtida tomando e determinandodc,(n,m)(n,m)dn/cm≥1N=1F→0n=1,2,3,…

(3)m=⌊nlog⁡dlog⁡c⌋.

A prova é direta.

Tudo isso significa que, quando estivermos dispostos a rolar o dado original com lados um número suficientemente grande de vezes podemos esperar simular quase resultados de um dado com lado por rolo . Equivalentemente,dn,log⁡d/log⁡c=logc⁡dc

É possível simular um grande número de rolos independentes de um -sided morrer utilizando uma feira -sided morrer utilizando uma média de rola por resultado, onde pode ser arbitrariamente pequeno, escolhendo suficientemente grande.mcdlog⁡(c)/log⁡(d)+ϵ=logd⁡(c)+ϵϵm


Exemplos e algoritmos

Na questão, e donded=6c=150,

logd⁡(c)=log⁡(c)log⁡(d)≈2.796489.

Assim, o melhor procedimento possível exigirá, em média, pelo menos rolos de a para simular cada resultado.2.796489d6d150

A análise mostra como fazer isso. Não precisamos recorrer à teoria dos números para realizá-la: podemos apenas tabular as potências e as potências compará-las para descobrir onde estão próximos. Este cálculo da força bruta fornece paresdn=6ncm=150mcm≤dn(n,m)

(n,m)∈{(3,1),(14,5),…}

por exemplo, correspondendo aos números

(6n,150m)∈{(216,150),(78364164096,75937500000),…}.

No primeiro caso iria associar dos resultados de três rolos da falha e os outros resultados que cada ser associado com um único resultado de um . t216−150=66150d6150d150

No segundo caso, associaria dos resultados de 14 de a a Failure - cerca de 3,1% de todos - e produziria uma sequência de 5 resultados de a .t78364164096−75937500000d6d150

Um algoritmo simples para implementart rotula as faces da matriz lado com os números e as faces da matriz lado com os números Os rolos do primeiro dado são interpretados como um número de dígitos na base Isso é convertido em um número na base Se tiver no máximo dígitos, a sequência dos últimos dígitos será a saída. Caso contrário, retorna Fail ao invocar-se recursivamente.d0,1,…,d−1c0,1,…,c−1.nnd.c.mmt

Para seqüências muito mais longas, é possível encontrar pares adequados considerando todos os outros convergentes da expansão contínua da fração de A teoria das frações contínuas mostra que esses convergentes alternam entre ser menor que e maior que ele (supondo que ainda não seja racional). Escolha aqueles que são menores que(n,m)n/mx=log⁡(c)/log⁡(d).xxx.

Na questão, os primeiros poucos convergentes são

3,14/5,165/59,797/285,4301/1538,89043/31841,279235/99852,29036139/10383070….

No último caso, uma sequência de 29.036.139 jogadas de a d6produzirá uma sequência de 10.383.070 jogadas de a d150com uma taxa de falha menor que para uma eficiência de indistinguível do limite assintótico.2×10−8,2.79649


2
Por incrível que pareça, quase parece que essa resposta foi formatada e preparada mesmo antes da pergunta ser feita!
— Łukasz Grad

1
Obrigado, @ ŁukaszGrad. No entanto, sou inocente de tais maquinações e tenho certeza de que os leitores de olhos atentos encontrarão evidências da pressa com que escrevi isso, pelas quais peço desculpas antecipadamente.
— whuber

Também não deve ser levado em consideração que, quando não é primo, o espaço de amostra pode ser particionado em subconjuntos de igual probabilidade? Por exemplo, você pode usar um d6 como um d2 ou um d3, e um espaço de amostra com 162 elementos - mais perto de 150 do que o 216 é - é possível com 4 rolos, 1d6 + 3d3. (Isso dá o mesmo número esperado de rolos que a solução 3d6, mas uma variação menor.)Ω ( d , 1 )dΩ(d,1)
— Scortchi - Reinstate Monica

@ Scortchi Você descreve uma configuração ligeiramente diferente na qual se pode escolher dados para simular empates de uma distribuição uniforme. Uma análise semelhante se aplica - você pode achar divertido executá-la.
— whuber

7

Para o caso de , rolar um d6 três vezes distintamente cria resultados.N=15063=216

O resultado desejado pode ser tabulado desta maneira:

  • Grave um d6 três vezes sequencialmente. Isso produz os resultados . O resultado é uniforme porque todos os valores de são igualmente prováveis ​​(os dados são justos e estamos tratando cada jogada como distinta).a,b,ca,b,c
  • Subtraia 1 de cada um.
  • Este é um número senário: cada dígito (valor do local) varia de 0 a 5 com potências de 6, para que você possa escrever o número em decimal usando
    (a−1)×62+(b−1)×61+(c−1)×60
  • Adicione 1.
  • Se o resultado exceder 150, descarte o resultado e role novamente.

A probabilidade de manter um resultado é . Todos os testes são independentes e repetimos o procedimento até um "sucesso" (resultado em ), de modo que o número de tentativas para gerar 1 empate entre 1 e 150 seja distribuído como uma variável aleatória geométrica, que tem expectativa . Portanto, o uso desse método para gerar 1 empate requer rolar dados em média (porque cada tentativa lança 3 dados).p=150216=25361,2,…,150p-1=36p−1=36253625×3=4.32


Agradecemos a @whuber por sugerir isso no chat.


Acredito que o método de Henry não produz uma distribuição uniforme. Isso ocorre porque a reciclagem fará com que alguns dígitos sejam favorecidos. Não tenho muita certeza disso, porque não entendo completamente como a reciclagem deve ser realizada.
— whuber

1
@whuber AH! Eu entendo sua preocupação agora. Eu apenas tentei explicar o processo para mim mesmo e percebi por que minha intuição era falha: a probabilidade de rolar um dado adicional pode alterar a atribuição de probabilidades para números decimais e torná-lo não uniforme, porque não sabemos antecipadamente como muitos dados que estamos rolando.
— Sycorax diz Restabelecer Monica

4

Aqui está uma alternativa ainda mais simples à resposta do Sycorax para o caso em que . Como você pode executar o seguinte procedimento:N=150150=5×5×6

Gerando número aleatório uniforme de 1 a 150:

  • Faça três rolos ordenados de 1D6 e indique-os como .R1,R2,R3
  • Se um dos dois primeiros testes for seis, rolar novamente até que não seja 6.
  • O número é um número uniforme usando notação posicional com uma raiz de 5-5-6. Assim, você pode calcular o número desejado como: (R1,R2,R3)
    X=30⋅(R1−1)+6⋅(R2−1)+(R3−1)+1.

Esse método pode ser generalizado para maior , mas se torna um pouco mais estranho quando o valor tem um ou mais fatores primos maiores que .N6


1
Você pode indicar a eficiência desse método em termos do número esperado de jogadas por sorteio gerado e esclarecer por que o resultado é uniforme em 1,2, ...., 150?
— Sycorax diz Restabelecer Monica

A probabilidade de obter um resultado que não requer relançamento é , o mesmo que na sua resposta. Para entender por que é uniforme, observe que você efetivamente está apenas gerando um número uniforme usando notação posicional com o radical 5-5-6 (ou seja, o último dígito são as unidades, o segundo último dígito é os "seis" e o terceiro último dígito são os "trinta"). 25/36
— Restabeleça Monica

1
O método é efetivamente apenas uma variação muito pequena do método em sua resposta. Na sua resposta, você cria um número uniforme na escala de números 6-6-6 e descarta valores inválidos, enquanto na minha resposta você descarta valores inválidos primeiro para gerar um número na escala 5-5-6.
— Restabeleça Monica

3
+1 Por uma questão prática, este é um algoritmo atraente. É intrigante, e talvez sugestivo de uma análise mais ampla, que implemente um autômato de estado finito acionado pelos rolos de matriz. Possui quatro estados, {Iniciar, A, B, Aceitar}. Inicie as transições para A ao rolar 1..5; A faz a transição para B após rolar 1..5; e B transita para Aceitar ao rolar qualquer coisa. Cada transição salva o valor do rolo que o causou, portanto, ao atingir Aceitar, você produz a sequência de três rolos armazenados e faz a transição automaticamente de volta para Iniciar.
— whuber

4
Você rejeita tantas vezes quanto o @Sycorax, mas faz menos rolagens em média. O esperado não. rolos por variável é . 65+65+1=3.4
— Scortchi - Restabelecer Monica

2

Como ilustração de um algoritmo para escolher uniformemente entre valores usando dados de seis lados, tente isso, que usa cada rolagem para multiplicar os valores disponíveis por e tornando igualmente provável cada um dos novos valores:1506

  • Após lançamentos, você tem possibilidade, não o suficiente para distinguir valores01150
  • Após rolo, você tem possibilidades, insuficientes para distinguir valores16150
  • Após jogadas, você tem possibilidades, insuficientes para distinguir valores236150
  • Após lançamentos, você tem possibilidades, o suficiente para distinguir valores, mas com valores restantes; a probabilidade de você parar agora é321615066150216
  • Se você não parou, depois de jogadas, você tem possibilidades restantes, o suficiente para distinguir valores de duas maneiras, mas com valores restantes; a probabilidade de parar agora é4396150963001296
  • Se você não parou, depois de jogadas, você tem possibilidades restantes, o suficiente para distinguir valores de três maneiras, mas com valores restantes; a probabilidade de parar agora é5576150964507776
  • Se você não parou, depois de jogadas, você tem possibilidades restantes, o suficiente para distinguir valores de cinco maneiras, mas com valores restantes; a probabilidade de parar agora é6756150675046656

Se você estiver em um dos valores restantes após jogadas, estará em uma situação semelhante à posição após rolagem. Portanto, você pode continuar da mesma maneira: a probabilidade de parar após jogadas é , depois de jogadas é etc.6617027993681501679616

Adicione-os e você descobrirá que o número esperado de rolos necessários é de cerca de . Ele fornece uma seleção uniforme dos , pois você só seleciona um valor no momento em que pode selecionar cada um dos com igual probabilidade3.39614150150


A Sycorax pediu nos comentários um algoritmo mais explícito

  • Primeiro, trabalharei na base com615010=4106
  • Segundo, em vez dos valores-alvo a , subtrairei um para que os valores-alvo sejam a164106064096
  • Terceiro, cada dado deve ter valores a , e rolar um dado envolve adicionar um dígito básico de dígitos no lado direito do número gerado existente. Os números gerados podem ter zeros à esquerda e o número de dígitos é o número de rolos até o momento06566

O algoritmo consiste em sucessivos lançamentos de dados:

  • os três primeiros dados para gerar um número de a . Desde você pega o valor gerado (que também é o restante na divisão por ) se o valor gerado estiver estritamente abaixo de e parar;0006555610006÷4106=16 remainder 1506410610006−1506=4106

  • Se continuar, role o quarto dado para gerar um número de a . Como o restante do valor gerado na divisão é se o valor gerado estiver estritamente abaixo de e parar;4100655556100006÷4106=126 remainder 24064106100006−2406=53206

  • Se continuar, role o quinto dado para gerar um número de a . Como o restante do valor gerado na divisão é se o valor gerado estiver estritamente abaixo de e parar;5320065555561000006÷4106=1236 remainder 330641061000006−3306=552306

  • Se continuar, role o sexto dado para gerar um número de a . Como o restante do valor gerado na divisão é se o valor gerado estiver estritamente abaixo de e parar;5523006555555610000006÷4106=12356 remainder 106410610000006−106=5555506

  • etc.


(+1) Essa resposta seria mais clara se você explicasse como mapeia os resultados de, digamos, 4d6 ou 5d6 para 1,2, ..., 150.
— Sycorax diz Reinstate Monica

@Sycorax - Agora forneci um mapeamento de base6
— Henry

1
Considerações sobre entropia indicam que você pode se sair substancialmente melhor que esse algoritmo. Resta também mostrar que seu algoritmo realmente produz valores distribuídos independentemente com distribuições uniformes .
— whuber

@whuber - Meu algoritmo produz exatamente um número inteiro a partir de possibilidades e o faz de maneira uniforme, desde que os dados sejam uniformes e independentes. Em cada etapa, se atingido, é provável que cada um dos valores seja selecionado. Não produz múltiplos valores (ao contrário da sua resposta)150150150
— Henry

1
Entendi mal o que você quis dizer, então, ao escrever "o algoritmo são sucessivos rolos de dados". (Eu deveria ter lido com mais cuidado.) Ao fazer isso, parece-me que seu algoritmo não produz uma distribuição uniforme, mas não tenho certeza porque não fui capaz de descobrir qual o objetivo do algoritmo geral. estar. Seria bom ver uma demonstração de que produz valores uniformes.
— whuber
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.