Algún tipo dijo lo siguiente:
Cualquiera que intente generar números aleatorios por medios deterministas está, por supuesto, viviendo en un estado de pecado.
Eso siempre se entiende que no puede generar números aleatorios verdaderos con solo una computadora. Y dijo que cuando las computadoras tenían el tamaño equivalente de un único microprocesador Intel 8080 (~ 6000 válvulas). Las computadoras se han vuelto más complejas, y creo que la declaración de von Von Neumann puede que ya no sea cierta. Considere que un algoritmo implementado solo de software es imposible. Se ejecutan en hardware físico. Los verdaderos generadores de números aleatorios y sus fuentes de entropía también están hechos de hardware.
Este fragmento de Java se coloca en un bucle:
file.writeByte((byte) (System.nanoTime() & 0xff));
puede crear un archivo de datos que he representado como una imagen:
Puedes ver la estructura, pero también con mucha aleatoriedad. Lo interesante es que este archivo PNG tiene un tamaño de 232 KB, pero contiene 250,000 píxeles de escala de grises. El nivel de compresión PNG era máximo. Eso es solo una relación de compresión del 7%, es decir. bastante no compresible Lo que también es interesante es que el archivo es único. Cada generación de este archivo es un patrón ligeramente diferente y tiene una compresibilidad ~ 7% similar. Destaco esto, ya que es fundamental para mi argumento. Eso es ~ 7 bits / byte entropía. Eso reducirá, por supuesto, con el uso de un algoritmo de compresión más fuerte. Pero no reduzca a nada cerca de 0 bits / byte. Se puede tener una mejor impresión tomando la imagen de arriba y sustituyendo su mapa de color por uno aleatorio:
La mayor parte de la estructura (en la mitad superior) desaparece, ya que eran solo secuencias de valores similares pero marginalmente diferentes. ¿Es esta una verdadera fuente de entropía creada simplemente ejecutando un programa Java en un sistema operativo multi-toma? ¿No es un generador de números aleatorios distribuido uniformemente, sino la fuente de entropía para uno? Una fuente de entropía creada con software que se ejecuta en hardware físico que resulta ser una PC.
Hecho suplementario
Para confirmar que cada imagen genera una entropía nueva sin un patrón fijo común a todos, se generaron 10 imágenes consecutivas. Estos fueron concatenados y comprimidos con el archivador más fuerte que puedo compilar (paq8px). Este proceso eliminará todos los datos comunes, incluida la correlación automática, dejando solo los cambios / entropía.
El archivo concatenado se comprimió a ~ 66%, lo que conduce a una tasa de entropía de ~ 5.3 bits / byte o 10.5Mbits / imagen. Una sorprendente cantidad de entropía
Suplementario 2
Ha habido comentarios negativos de que mi entropía por metodología de prueba de compresión es defectuosa, solo da una estimación de límite superior suelto. Así que ahora he ejecutado el archivo concatenado a través de la prueba de evaluación de entropía criptográfica oficial de NIST, SP800-90B_EntropyAssessment . Esto es tan bueno como se obtiene para la medición de entropía sin IID. Este es el informe (lo siento, esta pregunta se está haciendo larga, pero el problema es complejo): -
Running non-IID tests...
Entropic statistic estimates:
Most Common Value Estimate = 7.88411
Collision Test Estimate = 6.44961
Markov Test Estimate = 5.61735
Compression Test Estimate = 6.65691
t-Tuple Test Estimate = 7.40114
Longest Reapeated Substring Test Estimate = 8.00305
Predictor estimates:
Multi Most Common in Window (MultiMCW) Test: 100% complete
Correct: 3816
P_avg (global): 0.00397508
P_run (local): 0.00216675
Multi Most Common in Window (Multi MCW) Test = 7.9748
Lag
Test: 100% complete
Correct: 3974
P_avg (global): 0.00413607
P_run (local): 0.00216675
Lag Prediction Test = 7.91752
MultiMMC Test: 100% complete
Correct: 3913
P_avg (global): 0.00407383
P_run (local): 0.00216675
Multi Markov Model with Counting (MultiMMC) Prediction Test = 7.9394
LZ78Y Test: 99% complete
Correct: 3866
P_avg (global): 0.00402593
P_run (local): 0.00216675
LZ78Y Prediction Test = 7.95646
Min Entropy: 5.61735
El resultado es que NIST cree que he generado 5.6 bits / byte de entropía. Mi estimación de compresión de bricolaje pone esto en 5,3 bits / byte, marginalmente más conservador.
-> La evidencia parece apoyar la idea de que una computadora que solo ejecuta software puede generar entropía real. Y que von Neumann estaba equivocado (pero tal vez correcto para su tiempo).
Ofrezco las siguientes referencias que pueden respaldar mi reclamo:
¿Existen modelos estocásticos de no determinismo en la tasa de ejecución del programa?
Análisis WCET de sistemas probabilísticos de tiempo real duro
¿Existe un algoritmo de software que pueda generar un patrón de caos no determinista? y la relevancia de los efectos caóticos.
Paralelos con el principio de incertidumbre entrópica cuántica
Entrada de blog de Aleksey Shipilёv sobre el comportamiento caótico de nanoTime (). Su diagrama de dispersión no es diferente al mío.
System.nanoTime()
.