¿Cuántos bits aleatorios se necesitan para generar un entero uniformemente aleatorio entre 0 y 9?

Replanteemos un poco la pregunta. Está buscando una función que tome como entrada un número entero de bits uniformemente aleatorios; en otras palabras, una muestra de una distribución de probabilidad discreta con 2 ^ n eventos. Cada evento tiene la misma probabilidad: 1 / (2 ^ n).

Se supone que la salida de esta función son muestras de una función de masa de probabilidad uniforme diferente, en este caso, una con exactamente diez resultados y una probabilidad de 1/10 para cada una.

La función es determinista: nuestra única fuente de aleatoriedad es la entrada. En otras palabras, cada evento de entrada posible (hay 2 ^ n de ellos) se asigna a uno de los diez eventos de salida posibles.

Visto de esta manera, la respuesta es clara: no puedes hacerlo exactamente con ninguna n finita. Sin embargo, si asigna las 2 ^ n entradas a las diez salidas, algunas de las salidas terminarán con más de una décima parte de las entradas y otras terminarán con menos de una décima parte. Esto se debe a que 2 ^ n nunca es divisible por 10.

Sin embargo, puede obtener un arbitrario cercano al uniforme a medida que aumenta el valor de n (la cantidad de bits que toma). Entonces, para cualquier tolerancia que esté dispuesto a permitir que la distribución de salida difiera de exactamente uniforme, hay una cantidad de bits (an) que garantiza que cumplirá con esa restricción.

Por diversión, hagamos los cálculos. Digamos que nuestro objetivo es que cada salida tenga exactamente una décima parte de las entradas (y, por lo tanto, una probabilidad de 1/10), pero estamos dispuestos a dejar que sea tan baja como 1/10-e o tan alta como 1/10 + e. Una manera simple de hacer el mapeo es encontrar el piso de 2 ^ n / 10, es decir, el entero más grande menor o igual a 2 ^ n / 10. Asignamos este número de entradas a las primeras nueve salidas, y el resto a La décima salida.

Los primeros nueve chicos terminan “bajos”, ¿por cuánto? Por lo que queda cuando divide 2 ^ 20 por 10: es decir, por (2 ^ n% 10) / 10 entradas de 2 ^ n en total, así que por (2 ^ n% 10) / (10 * 2 ^ n)) probabilidad. La probabilidad del último tipo termina “alta” – en 9 veces ese mismo valor. Siempre que sea menor que e (la tolerancia a divergir de la uniformidad exacta), estamos listos para comenzar. En otras palabras, puede hacer coincidir una distribución decimal uniforme con tolerancia +/- e utilizando no más de n bits, donde (9/10) * (2 ^ -n) * (2 ^ n% 10) -lg (e / 9 ) (Definitivamente hay algunos límites más estrictos).

Para resumir: si desea hacer coincidir una distribución uniforme de los dígitos del 0 al 9 con probabilidad uniforme 0.1 y tolerancia e, y tiene más de -lg (e / 9) bits, puede hacerlo. Si desea hacer coincidir exactamente una distribución uniforme, es decir, si e es cero, no hay n finito que pueda hacerlo.

Respondiendo a la pregunta de Benjamin Schak, hay un algoritmo que le proporciona un conjunto de dígitos decimales uniformes de bits, donde, por ejemplo, 3.41 bit se usa en promedio para un bit.
Según la teoría de la información, podemos saber que un dígito (con 10 posibilidades) con distribución uniforme contiene [math] log_2 (10) = 3.3219 [/ math] … información de bits, por lo que al menos necesita este número de bits. Y también puedes acercarte a este límite inferior.

Por ejemplo, puedes hacer esto:
Solicite 10 bits aleatorios, conviértalo a un número decimal, obtendrá un número Y entre 0 … 1023 uniformemente. Si Y <1000, simplemente use los 3 decimales de Y como decimales aleatorios. De lo contrario, solicite 10 bits más.
Debe regenerar los 10 bits con una probabilidad de 24/1024, por lo que, en promedio, deberá solicitar los 10 bits 1024/1000 = 1.024 veces.
Entonces, en promedio, necesita 1.024 * 10 bits para 3 decimales, entonces 10.24 / 3 = 3.41333 … para uno decimal.

Alguna discusión del resultado:
1. Benjamin Schak mostró algoritmos, que no funcionaban en este estilo de “flujo”, pero generaban decimales uno por uno, y olvidan todo cuando generan los próximos decimales. Supongo que si necesita generar un decimal a la vez, y luego olvidar todo y generar uno nuevo, necesitará más de 4 bits. (Tengo una prueba en mi mente pero tal vez puedas probarlo en los comentarios)
Sin embargo, no es una trampa usar memoria, y tampoco es una sorpresa que si olvidas los bits pasados, pierdes algo de información, por lo que necesitarás más bits

2. este resultado puede ser generalizado. Entonces tome m bits, conviértalo a decimales, obtendrá decimales floor (m * log_2 (10)). Más cerca de m * log_2 (10) a un número entero mejor el resultado.
Se puede demostrar que este método puede ser arbitrario cerca del límite superior log_2 (10).
Por lo tanto, debe encontrar la “mejor” aproximación de la fracción superior de log_2 (10).
En este ejemplo, que era 10/3 = 3.3333 funciona muy bien, creo.

Estoy de acuerdo con otros respondedores en que no existe un algoritmo para obtener una distribución uniforme de 0–9 en un número finito de pasos. Pero, ¿qué sucede si permitimos un “pseudo-algoritmo” (mi término inventado) que no se garantiza que se detenga en un tiempo finito, pero que se detiene con probabilidad 1?

Por ejemplo, aquí hay un pseudo algoritmo obvio:

  1. Tome 4 bits aleatorios para obtener un número aleatorio entre 0 y 15.
  2. Si su número está entre 0 y 9, deténgase.
  3. De lo contrario, comience de nuevo.

Este pseudo-algoritmo claramente se detiene con probabilidad 1, porque se detiene después de a lo sumo n rondas con probabilidad [matemática] 1- (6/16) ^ n \ rightarrow 0 [/ matemática]. Este pseudo algoritmo requiere, en promedio, 6,4 bits, que calculo de la siguiente manera: Hay una probabilidad 1 de que requerirá la primera ronda de cuatro bits, probabilidad 6/16 de que requerirá una segunda ronda de cuatro bits, probabilidad [matemáticas ] (6/16) ^ 2 [/ math] que requerirá una tercera ronda de cuatro bits, y así sucesivamente. Entonces, el número total de bits esperados es [matemática] 4 \ cdot \ sum_ {n = 0} ^ \ infty (3/8) ^ n = 4 \ cdot 8/5 = 6.4 [/ matemática].

¿Pero podemos hacerlo mejor? Si podemos. Aquí hay un pseudo-algoritmo que espera usar solo 4.6 bits:

  1. Tome 4 bits aleatorios para obtener un número aleatorio entre 0 y 15.
  2. Si su número está entre 0 y 9, deténgase.
  1. De lo contrario, reste 10 para obtener un número entre 0 y 5.
  2. Tome 1 bit aleatorio más, multiplique por 6 y agréguelo al número del paso 3–1 para obtener un número entre 0 y 11.
  3. Si su número está entre 0 y 9, deténgase.
  1. De lo contrario, reste 10 para obtener 0 o 1.
  2. Vuelva al paso 1, pero use el bit sobrante del paso 4–1 para el primero de los cuatro bits aleatorios.

En este pseudo-algoritmo, existe la probabilidad 1 de que requerirá los primeros 4 bits aleatorios, la probabilidad 6/16 de que requerirá al menos 1 bit más, luego la probabilidad (6/16) * (2/12) que requerirá otros 3, luego probabilidad (6/16) * (2/12) * (6/16) que requerirá otro 1, luego probabilidad (6/16) * (2/12) * (6/16) * (2 / 12) que requerirá otros 3, y así sucesivamente. Esto se suma a:
4 + (1 * 3/8 + 3 * (3/8) * (1/6)) * [1 + (3/8) * (1/6) + ((3/8) * (1/6 )) ^ 2 +…]
= 4 + (9/16) * (1 + (1/16) + (1/16) ^ 2 +…]
= 4 + (9/16) * (16/15)
= 4 + 15/9
= 4.6.

¿Podemos hacerlo mejor (en promedio) que 4.6 bits? No lo sé.

¿Existe una fórmula simple para el número esperado de muestras de una distribución Uniforme ( k ) que se requieren para obtener una variable Uniforme ( n ), donde k < n ?

More Interesting

¿Podría la funcionalidad de una computadora digital ser duplicada por una computadora mecánica (con engranajes, ruedas, palancas, etc.)?

Cómo encontrar el número total de palíndromos diferentes de longitud k en una cadena dada usando una matriz de sufijos

¿Podría alguien ayudarme a determinar qué camino en mi educación se adaptaría mejor a mis intereses?

¿Cuándo requerimos hacer una transformación no lineal o reducción de dimensiones como el kernel PCA?

¿Han publicado algunos expertos impresiones iniciales del artículo de ArXiv que afirman NP = PSPACE?

¿Cuáles son los departamentos de investigación más sólidos para la teoría de la computabilidad (recursividad) en el mundo en este momento?

¿Cómo podemos convertir una imagen en un sistema binario (0 y 1) o un código como QR?

¿Hay algún algoritmo del orden O (sqrt (n))?

¿Dónde puedo encontrar un tutorial simplificado para Atkin's Sieve?

No pude escribir el programa Fibonacci. ¿Cómo puedo desarrollar mis habilidades matemáticas?

¿Los problemas informáticos de tipo nQueens tienen aplicaciones en física, en particular en la teoría de la materia condensada?

¿Cuáles son algunos de los ejemplos más interesantes de problemas indecidibles sobre las máquinas de Turing?

¿Qué ventaja tiene la lógica difusa en las ollas arroceras sobre la lógica digital / sensor convencional?

¿Qué papel juega la habilidad matemática en la ingeniería informática o la codificación?

Mi cerebro no procesa muy bien la resolución de problemas matemáticos. ¿La programación es para mí?