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),
Pd,n(t∗A)1−F=Pc,m(A)(1)
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)
Nηd−n1−NFd−n=Pd,n(t∗A)1−F=Pc,m(A)=c−m.(2)
É 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,…
m=⌊nlogdlogc⌋.(3)
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,logd/logc=logcdc
É 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.796489d6
d150
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=66150d6
150d150
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−75937500000d6
d150
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 d6
produzirá uma sequência de 10.383.070 jogadas de a d150
com uma taxa de falha menor que para uma eficiência de indistinguível do limite assintótico.2×10−8,2.79649
Para o caso de , rolar um d6 três vezes distintamente cria resultados.N=150 63=216
O resultado desejado pode ser tabulado desta maneira:
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=2536 1,2,…,150 p-1=36p−1=3625 3625×3=4.32
Agradecemos a @whuber por sugerir isso no chat.
fonte
Aqui está uma alternativa ainda mais simples à resposta do Sycorax para o caso em que . Como você pode executar o seguinte procedimento:N=150 150=5×5×6
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 .N 6
fonte
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:150 6
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.6 6 1 7 0279936 8 1501679616
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.39614 150 150
A Sycorax pediu nos comentários um algoritmo mais explícito
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;0006 5556 10006÷4106=16 remainder 1506 4106 10006−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;41006 55556 100006÷4106=126 remainder 2406 4106 100006−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;532006 555556 1000006÷4106=1236 remainder 3306 4106 1000006−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;5523006 5555556 10000006÷4106=12356 remainder 106 4106 10000006−106=5555506
etc.
fonte