7 votos

Pruebe la aleatoriedad (distribuida uniformemente) en un generador aleatorio de flotadores de 64 bits

Tenemos un generador de números aleatorios que se supone que genera flotadores de 64 bits, de manera uniforme.

Queremos probar si se trata de una buena aleatoriedad uniforme.

No estoy preguntando la forma general de probarlo, como se preguntó aquí https://stackoverflow.com/questions/22916519/test-the-randomness-of-a-black-box-that-outputs-random-64-bit-floats .

Según tengo entendido, el primer paso para la prueba es dividir de alguna manera todo el rango en tamaños iguales como bins, luego seguimos generando y vemos el número de "pelotas" que caen en cada recipiente.

Mi pregunta es sobre este primer paso.

¿Cómo debo dividir todo el rango de flotación de 64 bits?

El rango está entre -1.79769313486231571e+308 y 1.79769313486231571e+308 y es enorme.

Mi idea es utilizar el 64 bits . Puedo diseñar los contenedores de igual tamaño así:

  1. Cada float tiene 64 bits, por lo que tenemos 64 bins.
  2. Para cada flotador generado, leemos todos esos bits, si un bit es 1, entonces incrementamos el número del bin correspondiente en 1
  3. Después de N muestreos, el número esperado de cada recipiente debe ser N/2 .
  4. Entonces seguimos prueba de chi-cuadrado de pearson etc.

2voto

tylerharms Puntos 79

Tal y como está, esto es no una buena manera de comprobar si los números en coma flotante están distribuidos uniformemente. Como Aksakal Me preguntaba si los bits de la parte del exponente de la representación en coma flotante estarían distribuidos uniformemente. La respuesta a esto es que no son distribuido uniformemente, porque hay muchos más números con exponentes grandes que con exponentes pequeños.

He escrito un pequeño programa de prueba que lo confirma. Genera $N = 1 \text{ million}$ números aleatorios de punto flotante distribuidos uniformemente, y como control, $N$ enteros al azar. (Hubo varios problemas para generar números de punto flotante de 64 bits, véase por ejemplo aquí y 32 bits parecen suficientes para la demostración).

Primero, el caso de control. El diagrama de las franjas de bits para los enteros es tal y como sugeriste, con cada franja $\approx N/2$ . enter image description here

Ahora los números en coma flotante. Un gráfico de los números ordenados es una línea recta, lo que indica que pasarían el Kolmogorov-Smirnov prueba de uniformidad. enter image description here

Pero las papeleras definitivamente no son uniformes. enter image description here

Si se trazan sólo las casillas 1 a 23 junto con la casilla 32, se obtienen casillas $\approx N/2$ pero las franjas 24 a 31 muestran un claro patrón de aumento. Estos bits se corresponden precisamente con los bits del exponente en los números de 32 bits en coma flotante. El Definición de punto flotante de precisión única IEEE estipula

  • los 23 bits menos significativos son para la mantisa
  • los siguientes 8 bits son para el exponente
  • el bit más significativo es para el signo

Otra forma de ver esto es considerar un ejemplo más sencillo. Piensa en generar números en base 10 entre 0 y $10^7$ con un exponente de base 10. Los números entre 0 y 1 tendrían un exponente de 0. Los números entre 1 y 10 tendrían un exponente de 1, los números entre 10 y 100 un exponente de 2, ..., y los números entre $10^6$ y $10^7$ un exponente de 7. Los números $10^4$ a $10^7$ son $(10^7-10^4)/10^7=99.9\%$ del rango y en binario sus exponentes van del 001 al 111, por lo que se espera que el bit más significativo ocurra el 99,9% de las veces, no el 50% de las veces.

Sería posible, con cierto cuidado, utilizar un enfoque como este para obtener las frecuencias esperadas para cada bin en el exponente binario de un número de punto flotante, y utilizar esto en un $\chi^2$ pero Kolmogorov-Smirnov es un enfoque mejor en teoría y fácil de aplicar. Sin embargo, una prueba como ésta podría detectar sesgos de distribución en la implementación de una generación de números aleatorios que Kolmogorov-Smirnov podría no detectar. Por ejemplo, cuando intenté por primera vez generar números aleatorios de punto flotante de doble precisión de 64 bits en C++, me olvidé de cambiar a un Motor Mersenne Twister de 64 bits . Los números ordenados dan un gráfico de línea recta, pero se puede ver en los gráficos de los bins de los bits que el motor Mersenne Twister de 64 bits es superior al de 32 bits (como era de esperar).

enter image description here

(Obsérvese en ambos casos que el último bit, el de signo, es cero, debido al dificultades para generar números aleatorios en toda la gama .)

1voto

Aksakal Puntos 11351

0 votos

Hola. Entiendo que hay varias formas y buenas maneras de probar realmente la aleatoriedad. Pero en esta pregunta, particularmente sé si mi idea es correcta o no

0 votos

La razón por la que sugiero que no se inventen sus propias pruebas, es que es un asunto complicado. tanta gente ha utilizado los RNGs durante tanto tiempo que tiene que haber una prueba probada y comprobada que funcione, como el "Monobit" o la "Prueba de frecuencia dentro de un bloque", que son sospechosamente similares a lo que usted parece estar tratando de hacer (ver la suite del NIST)

0 votos

Hola, lo siento, esta pregunta es de una entrevista telefónica para un puesto de desarrollador. Creo que quieren pedir conocimientos generales de estadística, combinados con métodos de CS. por eso me centro en los bits

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X