Inspirado por Random con las manos atadas :
La meta
El objetivo de este desafío es escribir un programa que genere una secuencia de bits pseudoaleatoria, que es una cadena de 1s y 0s que parece ser puramente aleatoria, pero que en realidad se genera de manera determinista. Su programa debe generar una cadena de 1 y 0 (con espacios en blanco opcionales) y debe cumplir los siguientes requisitos:
- Con tiempo y memoria ilimitados, su programa debe continuar produciendo una cadena de 1s y 0s para siempre
- Su programa debe generar más de 1000 bits aleatorios en aproximadamente un minuto, en una máquina razonable. Si este requisito es imposible, lo disminuiré.
- La cadena de bits puede repetirse, pero la longitud de la sección de repetición debe ser superior a 1000 bits.
- La cadena de bits debe pasar tantas pruebas de aleatoriedad (descritas a continuación) como sea posible.
- El programa no debe tomar ninguna entrada de ninguna fuente externa ni utilizar ninguna función incorporada de tipo rand ().
- Debido al requisito anterior, el programa debe generar la misma cadena de bits exacta cada vez que se ejecuta.
Prueba de aleatoriedad # 1
La cadena de bits pseudoaleatorios no debe incluir ningún patrón obvio en la inspección visual.
Prueba de aleatoriedad n. ° 2 (sujeta a cambios según los comentarios)
La cadena de bits debe contener una distribución igual de 1s y 0s. Para probar esto (y otras cosas también), el flujo de bits se divide en segmentos de 3 bits de longitud, como 101|111|001
.
De todos estos segmentos, 1/8 de ellos deben tener tres 1s y no 0s, 3/8 de ellos deben tener dos 1s y uno 0, 3/8 de ellos deben tener un 1 y dos 0s, y 1/8 de ellos no deberían tener 1s y tres 0s.
Prueba de aleatoriedad # 3
Una "ejecución" se define como una serie consecutiva de bits que tienen el mismo valor. La cadena 1001001110
tiene tres ejecuciones de tamaño 1 ( 1..1.....0
), dos ejecuciones de tamaño 2 ( .00.00....
) y una ejecución de tamaño 3 ( ......111.
). Tenga en cuenta que las ejecuciones no se superponen.
De una cadena de 1000 bits aleatorios, debe haber aproximadamente 250 ejecuciones de tamaño 1, 125 ejecuciones de tamaño 2, 62 ejecuciones de tamaño 3, etc. En general, para 1000/(2**(R+1))
ejecuciones de tamaño R, debería haber aproximadamente ejecuciones de ese tamaño.
Prueba de aleatoriedad # 4
Los primeros 840 bits se dividen en dos mitades de 420 bits cada una. Cada bit en la primera mitad se compara con el bit correspondiente en la segunda mitad. Los dos bits deben coincidir aproximadamente el cincuenta por ciento del tiempo.
Aquí está el código fuente de un programa Perl que realiza las pruebas 2 a 4. A partir de ahora, requiere que la cadena de bits no contenga ningún espacio en blanco.
Objetivo Criterio ganador ¡Tiempo!
El ganador es el programa que pasa los 6 requisitos y todas las pruebas de aleatoriedad en la medida en que no se puede distinguir de la aleatoriedad. Si varios programas logran esto, entonces ganará el que demore más tiempo en repetirse. Si varios programas logran esto, entonces podría tener que encontrar más pruebas de aleatoriedad para actuar como desempate.