Sí y no, dependiendo de lo que quiere decir con "la única manera". Sí, en el sentido de que no hay un método que garantice la terminación, lo mejor que puede hacer (para valores genéricos de y ) es un algoritmo que termina con la probabilidad 1. No, ya que puede hacer que el "desperdicio" sea pequeño como quieras.RNR
¿Por qué la terminación garantizada es imposible en general?
Suponga que tiene un motor de cálculo determinista (una máquina de Turing o lo que flota su barco), además de un oráculo que genera elementos aleatorios de la conjunto -elemento . Su objetivo es generar un elemento del conjunto de elementos . La salida de su motor depende solo de la secuencia de valores devueltos por el oráculo; es una función de esa secuencia potencialmente infinita .RN [ 0 , N - 1 ] f ( r 0 , r 1 , r 2 , ... )[0..R−1]N[0,N−1]f(r0,r1,r2,…)
Suponga que su motor llama al oráculo la mayoría de las veces . Puede haber rastros para los cuales el oráculo se llama menos de veces; si es así, llamar al oráculo veces adicionales para que siempre se llame exactamente veces no cambia la salida. Entonces, sin pérdida de generalidad, asumimos que el oráculo se llama exactamente veces. Entonces la probabilidad del resultado es el número de secuencias tal que . Como el oráculo es un generador aleatorio uniforme, cada secuencia es equiprobable y tiene la probabilidad . Por lo tanto, la probabilidad de cada resultado es de la formam m m x ( r 0 , … , r m - 1 ) f ( rmmmmx(r0,…,rm−1)1 / R m A / R m A 0 R mf(r0,…,rm−1)=x1/RmA/Rmdonde es un número entero entre y .A0Rm
Si divide durante algunos , entonces puede generar una distribución uniforme sobre elementos llamando al generador aleatorio veces (esto se deja como ejercicio para el lector). De lo contrario, esto es imposible: no hay manera de obtener un resultado con una probabilidad de . Tenga en cuenta que la condición es equivalente a decir que todos los factores primos de también son factores de (esto es más permisivo que lo que escribió en su pregunta; por ejemplo, puede elegir un elemento aleatorio entre 4 con un valor justo de 6 lados morir, a pesar de que 4 no divide a 6).R m m N m 1 / N N RNRmmNm1/NNR
Reduciendo el desperdicio
En su estrategia, cuando , no tiene que volver a dibujar inmediatamente. Intuitivamente, queda un poco de entropía en que puedes mantener en la mezcla.[ kr≥kN[kN..R−1]
Supongamos por un momento que usted, de hecho, seguir generando números aleatorios por debajo de para siempre, y se genera de ellos a la vez, haciendo dibuja. Si realiza un muestreo de rechazo directo en esta generación agrupada, el desperdicio sobre sorteos es , es decir, el resto dividido por el número de sorteos. Esto puede ser tan pequeño como . Cuando y son coprimos, puede hacer que el desperdicio sea arbitrariamente pequeño seleccionando valores suficientemente grandes de . Para valores generales de yu d d R d - kNudd RdmodNugcd(R,N)Rd−kNudRdmodNugcd(R,N)N d R N gcd ( R , N ) N / gcd ( R , N )RNdRN, el cálculo es más complicado porque debe tener en cuenta la generación de y separado, pero nuevamente puede hacer que el desperdicio sea arbitrariamente pequeño con grupos suficientemente grandes.gcd(R,N)N/gcd(R,N)
En la práctica, incluso con números aleatorios relativamente ineficientes (por ejemplo, en criptografía), rara vez vale la pena hacer algo más que un simple muestreo de rechazo, a menos que sea pequeño. Por ejemplo, en criptografía, donde es típicamente una potencia de 2 y es típicamente cientos o miles de bits, la generación uniforme de números aleatorios generalmente se realiza mediante muestreo de rechazo directo en el rango deseado.R NNRN