¿Es el muestreo de rechazo la única forma de obtener una distribución verdaderamente uniforme de números aleatorios?

21

Supongamos que tenemos un generador aleatorio que genera números en el rango con distribución uniforme y necesitamos generar números aleatorios en el rango con distribución uniforme.[ 0 .. N - 1 ][0..R1][0..N1]

Supongamos que y no dividen equitativamente a ; Para obtener una distribución verdaderamente uniforme , podemos utilizar el método de muestreo de rechazo :N RN<RNR

  • si es el mayor entero tal que k N < RkkN<R
  • escoja un número aleatorio r en [0..R1]
  • si r<kN entonces emite rmodN , de lo contrario siga intentando con otros números aleatorios r ', r ", ... hasta que se cumpla la condición
¿Es el muestreo de rechazo la única forma de obtener una distribución discreta verdaderamente uniforme?

Si la respuesta es sí, ¿por qué?

Nota: si N>R la idea es la misma: generar un número aleatorio r en [0..Rm1],Rm>=N , por ejemplo r=R(...R(Rr1+r2)...)+rm donde ri es un número aleatorio en el rango [0..R1]

Vor
fuente

Respuestas:

13

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..R1]N[0,N1]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,,rm1)1 / R m A / R m A 0 R mf(r0,,rm1)=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.[ krkN[kN..R1]

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)RdkNudRdmodNugcd(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

Gilles 'SO- deja de ser malvado'
fuente
La primera prueba es errónea: la existencia de es demasiado fuerte. Podemos tener una máquina que consume arbitrariamente muchos elementos, pero siempre termina. Básicamente, queremos excluir una secuencia (la que nunca termina), pero usted excluye todas menos muchas. m
Raphael
@Raphael No estoy seguro de entender lo que quieres decir. ¿Puedes dar un ejemplo de tal máquina?
Gilles 'SO- deja de ser malvado'
Ah, mi preocupación era demasiado general. Aquí, dada la ausencia de aportes, tiene razón. Si todos los cálculos terminan, hay un número finito (sin entrada, número finito de decisiones por paso, ergo un árbol finito), por lo tanto, hay uno más largo que le da . m
Raphael
@Raphael Su comentario me hace pensar en una mejor presentación para una audiencia de TCS: haga que el RNG sea la entrada de un TM en lugar de un oráculo. Suponemos que la TM termina (de lo contrario, el algoritmo es incorrecto). Si hay una tal que sea cual sea la entrada, el TM observa a lo sumo celdas de entrada, entonces <bla bla bla divisible por bla bla no puede tener resultados equiprobables>. De lo contrario, para todos los , la probabilidad de requerir al menos sorteos es al menos . m R m N m m R - mmmRmNmmRm
Gilles 'SO- deja de ser malvado'
1
@Raphael: el lema de König muestra que si la máquina siempre termina, entonces, de hecho, hay un límite superior en su tiempo de ejecución. Esto funciona siempre que el conjunto de salida del RNG sea finito (y de lo contrario, es trivialmente falso).
Yuval Filmus
6

El teorema de codificación fuente de Shannon muestra que, en cierto sentido, necesita samples (en promedio) del tipo para generar un número aleatorio del tipo . Más exactamente, Shannon da un algoritmo (ineficiente) que da muestras del primer tipo, emite muestras del segundo tipo, con alta probabilidad. También muestra que la salida de muestras con alta probabilidad es imposible.[ 0 , , R - 1 ] [ 0 , , N - 1 ]logN/logR[0,,R1][0,,N1]m ( log N / log R - ϵ ) m ( log N / log R + ϵ )mm(logN/logRϵ)m(logN/logR+ϵ)

El teorema de Shannon también funciona en el caso más general de una distribución de entrada sesgada (y probablemente también en una distribución de salida sesgada). En ese caso, debe reemplazar el logaritmo con la entropía. Si bien el algoritmo dado por el teorema se define al azar, en algunos casos es posible desrandomizarlo (a costa de un rendimiento algo peor).

Yuval Filmus
fuente
5

En realidad, no, el muestreo de rechazo está lejos de ser la única forma de proceder. Desafortunadamente, considerando que las computadoras almacenan toda la información como bits y, por lo tanto, solo pueden manipular bits aleatorios de información, cualquier algoritmo para dibujar una variable aleatoria uniforme de rango será infinito, si el desarrollo de la base binaria de es infinito.NNN

Este teorema es un resultado clásico de Knuth y Yao (1976), quienes desarrollaron el marco de los árboles DDG (árboles generadores de distribución discreta).

Los métodos expuestos por Gilles son el tipo típico de cosas que se han hecho para mitigar el desperdicio incurrido por el rechazo, pero, por supuesto, si uno puede generar el seguimiento de los árboles de Knuth y Yao, es mucho, mucho más eficiente, en promedio 96% de bits aleatorios son salvados

He dado más información sobre esto en la siguiente publicación de CStheory .

Jérémie
fuente