¿La mejor manera de determinar si una lista de bytes es aleatoria?


8

¿Existe algún algoritmo que pueda devolver algún valor que indique un nivel de aleatoriedad? Creo que se llama Data Entropy .

Recientemente leí este artículo: http://faculty.rhodes.edu/wetzel/random/mainbody.html

¿Su enfoque de analizar lanzamientos de monedas se aplicaría a bytes? ¿Debería desplegarme al nivel de bits donde es verdadero / falso nuevamente o hay una manera de determinar en función del valor de byte completo?

¿Son sus mejores análisis que este artículo?

Respuestas:


16

En TCS, otro enfoque para este problema ha sido a través de la prueba de propiedad de las distribuciones , donde uno debe distinguir si una distribución es (verdaderamente) distribución uniforme o "ni siquiera está cerca" de ser uniforme (de manera formal). Aquí se obtienen límites precisos sobre la cantidad de muestras necesarias para decidir sobre la pregunta.

Consulte, por ejemplo, la Sección 6 del siguiente tutorial: http://people.csail.mit.edu/ronitt/papers/icm.ps

En particular, se puede decidir si una distribución en es verdaderamente uniforme o es ε -lejos (en distancia total variación ) de ser uniforme con O ( [norte]ϵconsultas / muestras de dicha distribución. (Esto también es estricto en el sentido de queΩ(O(norte/ /ϵ4 4)se necesitan muestras)Ω(norte)


Curiosamente, todos estos métodos suponen que la distribución es iid. Es decir, una secuencia cíclica simple, como 123123123 con muy baja entropía, se consideraría uniforme con alta probabilidad. ¿Sabes si alguien ha considerado las pruebas de distribución para secuencias no iid?
Thomas Ahle

Escribí esto para verificar cosas como secuencias simples y detectar variaciones importantes de distribuciones de bytes aleatorias uniformes ... funciona bastante bien: github.com/earonesty/dotfiles/blob/master/randbytestest.py .
Erik Aronesty

6

No existe un único algoritmo correcto para medir la aleatoriedad. Varias pruebas estadísticas son un enfoque posible, como los otros ya han dicho. Otra posibilidad es comprimir la secuencia de bytes y ver qué sucede. Si obtiene aproximadamente 8 bits / byte (o más), la secuencia es aleatoria con respecto al modelo de datos subyacente al compresor.

De los métodos de compresión estándar, PPM utiliza un modelo estadístico explícito para predecir el siguiente carácter basado en el contexto anterior. Su principal debilidad es que no puede utilizar repetitividad a gran escala, como repeticiones idénticas de una secuencia aleatoria larga.

Los métodos de compresión basados ​​en el análisis LZ77 o la Transformación Burrows-Wheeler (BWT) funcionan bien, cuando hay muchas subcadenas repetidas en la secuencia. Sin embargo, muchas implementaciones prácticas tienen un tamaño de bloque / ventana limitado para ahorrar memoria, por lo que tampoco pueden utilizar la repetitividad a gran escala.

En lugar de comprimir la secuencia, también podría calcular alguna medida relacionada con el modelo de datos del compresor: entropía empírica de alto orden para PPM, el número de corridas de letras iguales en el BWT o el número de frases en el análisis LZ77. En los primeros dos casos, 8 bits de entropía por byte o n (1 - 1/256) se ejecutan para una secuencia de longitud n significa datos totalmente aleatorios.


5

De random.org:

Curiosamente, es teóricamente imposible demostrar que un generador de números aleatorios es realmente aleatorio. Más bien, analiza una cantidad cada vez mayor de números producidos por un generador dado, y dependiendo de los resultados, su confianza en el generador aumenta (o disminuye, según sea el caso)

Más información se puede encontrar aquí


4

bueno para números, no del todo adecuado para secuencias de bytes. aunque podría adaptarlo
Erik Aronesty

@Erik Se aplica fácilmente de muchas maneras. Todo lo que necesita es una manera de usar su RNG para crear secuencias de bits, y una secuencia de bytes ya es una secuencia de bits.
whuber

Supongo que no vi cómo aplicarlo a, por ejemplo, una matriz de 30 muestras de secuencias de 32 bytes. se ve muy completo ... y fácil de usar ( apt install dieharder).
Erik Aronesty

1
@Erik Los documentos dicen que "dieharder prefiere probar los generadores que han sido envueltos en una interfaz compatible con GSL para que puedan devolver una secuencia ilimitada de números aleatorios". Para ese propósito, una secuencia de 32 bytes puede interpretarse como una secuencia de 8 cortos sin signo, 4 largos sin signo, etc. Es bastante flexible, pero tiene que escribir una interfaz.
whuber

@ErikAronesty: 30 * 32 bytes simplemente no son suficientes datos, y ninguna prueba de aleatoriedad podrá sortear este hecho. Dieharder se reirá (por una buena razón) del tamaño de su muestra hasta que tenga aproximadamente 1 GB de datos más o menos.
Jay Sullivan

3

La complejidad de Kolmogorov es una forma de medir la aleatoriedad de las cadenas y es algorítmicamente incuestionable. Usando esta noción, es imposible medir la aleatoriedad de todas las cadenas. La existencia de dicho algoritmo podría usarse para resolver el problema de detención.


3

Como se mencionó en otras respuestas, la versión de decisión de este problema (como el problema de detención y una serie de otros problemas como el problema de mosaico) es indecidible. Sin embargo, creo que está preguntando sobre formas prácticas de medir la aleatoriedad de una colección de bits.

La práctica estándar aquí es ejecutar los datos a través de una serie de pruebas de aleatoriedad, como la prueba de Chi-cuadrado.


3

yopags(yo1/ /norte,...,yok/ /norte)

En la práctica, no hay una prueba universal para la aleatoriedad de la transmisión, en su lugar hay una serie de pruebas, y si su transmisión prueba k de las mejores pruebas y las supera todas, podemos estar razonablemente seguros de que es aleatoria ... hasta que alguien invente k + 1 ' st prueba que lo rompe.

Esto es lo que Knuth dice al respecto en "Art of Computer Algorithms, Vol 2"

"Si una secuencia se comporta aleatoriamente con respecto a las pruebas T1, T2, ..., Tn, no podemos estar seguros en general de que no será una falla miserable cuando se somete a una prueba adicional T (n + 1). Sin embargo cada prueba nos da más y más confianza en la aleatoriedad de la secuencia. En la práctica, aplicamos alrededor de media docena de diferentes tipos de pruebas estadísticas a una secuencia, y si las pasa satisfactoriamente consideramos que es aleatoria, entonces se presume inocente hasta que se demuestre lo contrario ".

Recomiendo leer la sección 3.1 "El arte de los algoritmos informáticos" de Knuth para una introducción general a la pseudoaleatoriedad y 3.3 sobre pruebas estadísticas para transmisiones.


0

Hice un conjunto de pruebas bastante débil que, sin embargo, fue muy útil para mí e indicativo de la naturaleza de las pruebas de aleatoriedad en general:

  1. generar una estadística para "datos aleatorios buenos conocidos" (matemática o empíricamente)
  2. generar la misma estadística para sus datos de muestra (es de esperar que tenga al menos 30 muestras más o menos)
  3. obtener un valor p para la diferencia (hipótesis: estas son de diferentes distribuciones)
  4. repetir para N estadísticas
  5. bonferonni corrige los resultados (divide por N)

La fuente está aquí: https://github.com/earonesty/dotfiles/blob/master/randbytestest.py

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.