Sim e não, dependendo do que você quer dizer com "o único caminho". Sim, na medida em que não há um método garantido para terminar, o melhor que você pode fazer (para valores genéricos de e ) é um algoritmo que termina com probabilidade 1. Não, na medida em que você pode fazer com que o “desperdício” seja pequeno Como você quiser.RNR
Por que a rescisão garantida é impossível em geral
Suponha que você tenha um mecanismo de computação determinístico (uma máquina de Turing ou o que flutua no seu barco), além de um oráculo que gera elementos aleatórios do conjunto de elementos . Seu objetivo é gerar um elemento do conjunto de elementos . A saída do seu mecanismo depende apenas da sequência de valores retornados pelo oráculo; é uma função dessa sequência potencialmente infinita .[ 0 .. R - 1 ] N [ 0 , N - 1 ] f ( r 0 , r 1 , r 2 , … )R[0..R−1]N[0,N−1]f(r0,r1,r2,…)
Suponha que seu motor chame o oráculo no máximo vezes. Pode haver vestígios pelos quais o oráculo é chamado menos de vezes; nesse caso, chamar o oracle vezes extras para que ele seja sempre chamado exatamente times não altera a saída. Portanto, sem perda de generalidade, assumimos que o oráculo é chamado exatamente vezes. Então a probabilidade do resultado é o número de seqüências tal forma que . Como o oráculo é um gerador aleatório uniforme, cada sequência é equiprobável e tem a probabilidade . Portanto, a probabilidade de cada resultado é da formam m m x ( r 0 , … , r m - 1 ) f ( r 0 , … , r m - 1 ) = x 1 / R m A / R m Ammmmx(r0,…,rm−1)f(r0,…,rm−1)=x1/RmA/Rmonde é um número inteiro entre e .AR m0Rm
Se divide por alguns , você pode gerar uma distribuição uniforme sobre elementos chamando o gerador aleatório vezes (isso é deixado como um exercício para o leitor). Caso contrário, isso é impossível: não há nenhuma maneira de obter um resultado com probabilidade . Observe que a condição é equivalente a dizer que todos os fatores primos de também são fatores de (isso é mais permissivo do que o que você escreveu em sua pergunta; por exemplo, você pode escolher um elemento aleatório entre 4 com uma equação de 6 lados morra, mesmo que 4 não divida 6).R m m N m 1 / N N RNRmmNm1/NNR
Reduzindo o desperdício
Na sua estratégia, quando , você não precisa redesenhar imediatamente. Intuitivamente, resta um pouco de entropia em que você pode manter na mistura.[ kr≥kN[kN..R−1]
Suponha por um momento que você vai de fato manter a geração de números aleatórios abaixo para sempre, e você gera deles de cada vez, fazendo empates. Se você fizer uma amostragem direta de rejeição nessa geração agrupada, o desperdício sobre será , ou seja, o restante dividido pelo número de empates. Isso pode ser tão pequeno quanto . Quando e são coprime, você pode reduzir o desperdício arbitrariamente pequeno escolhendo valores suficientemente grandes de . Para valores gerais de eu d d R d - kNuddRd−kNudRdmodNuR N d R N gcd ( R , N ) N / gcd ( R , N )gcd(R,N)RNdRN, o cálculo é mais complicado porque é necessário levar em consideração a geração de e separadamente, mas novamente você pode reduzir o desperdício arbitrariamente pequeno com grupos grandes o suficiente.gcd(R,N)N/gcd(R,N)
Na prática, mesmo com números aleatórios relativamente ineficientes (por exemplo, em criptografia), raramente vale a pena fazer algo além de amostragem simples de rejeição, a menos que seja pequeno. Por exemplo, na criptografia, onde é tipicamente uma potência de 2 e é tipicamente centenas ou milhares de bits, a geração uniforme de números aleatórios geralmente procede por amostragem direta por rejeição no intervalo desejado.R NNRN