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$ .
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.
Pero las papeleras definitivamente no son uniformes.
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).
(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 .)