En programación, ¿un generador de números aleatorios es realmente aleatorio? ¿O son los números aleatorios generados por un algoritmo oculto?

En los lenguajes de programación populares, los generadores de números aleatorios predeterminados son probablemente, como Mark Nelson mencionó, generadores de números pseudoaleatorios.

Pero me parece que el interrogador tiene curiosidad sobre dos cosas además de la respuesta dada:
1 / ¿Cuáles son ejemplos de algoritmos “ocultos”?
2 / ¿Cómo se mide la aleatoriedad?

Para responder a estas preguntas, tomaré prestado material del próximo libro de Art Owen sobre los métodos de Monte Carlo.

1 / ¿Cuáles son ejemplos de algoritmos “ocultos”?
Puede ser útil entender primero por qué usamos heurística en lugar de números aleatorios “verdaderos”.
a) Los verdaderos números aleatorios no se pueden comprimir.
b) Los números aleatorios verdaderos no se prestan a resultados reproducibles.
c) A veces, los “números aleatorios verdaderos” generados por procesos físicos no pasan la prueba de aleatoriedad.

Con esto en mente, mencionaré tres formas populares de generar números aleatorios. Todos estos se basan en recursiones simples usando aritmética modular. Por cierto, esto me dejó boquiabierto cuando vi esto por primera vez.
a) Generador lineal congruente:
[math] x_i = a_0 + a_1 x_ {i-1} \, \ mathrm {mod} \, M [/ math]
con cuidadosamente seleccionados [matemáticas] a_0, a_1 [/ matemáticas] y M.
b) Generador congruencial multiplicativo: (esto es realmente más rápido que LCG y no funciona peor en la práctica)
Tome [matemáticas] a_0 = 0 [/ matemáticas] arriba
c) Generador recursivo múltiple:
[matemáticas] x_i = a_1 x_ {i-1} + a_2 x_ {i-2} + \ cdots + a_k x_ {ik} \, \ mathrm {mod} \, M [/ math]

Otros métodos populares incluyen generador recursivo múltiple, generadores de Fibonacci rezagados, generador congruente inverso, registros de desplazamiento de retroalimentación generalizados y GFSR retorcido.

2 / ¿Cómo se mide la aleatoriedad?
a) Medidas de uniformidad
Para responder a esta pregunta, primero piense en cómo se vería un número aleatorio “bueno”. Suponga que [math] X_i \ sim U (0,1) [/ math] para [math] i = 1, 2, \ ldots [/ math]. Es decir, cada [matemática] X_i [/ ​​matemática] se distribuye como un número aleatorio uniforme de 0 a 1. Luego, una secuencia “buena” de [matemática] X_i [/ ​​matemática] debería tener un histograma más o menos uniforme.

Así que te imaginas que una buena medida de aleatoriedad sería la uniformidad del histograma. Pero, por supuesto, esto es defectuoso porque podría generar un histograma muy plano recorriendo [math] X_i = X_ {i-1} + \ varepsilon \, \ mathrm {mod} 1 [/ math], donde [math] \ varepsilon [/ math] es una pequeña cantidad. Por lo tanto, las personas desarrollan estas nociones de mirar la uniformidad de k-tuplas [matemáticas] (X_i, \ ldots, X_ {i + k-1}) [/ matemáticas] para diferentes k y subintervalos de la forma [matemáticas] [a / 2 ^ l, (a + 1) / 2 ^ l) [/ math] para [math] 0 \ leq a <2 ^ l [/ math].

Esto da lugar a la expresión “k-distribuido con precisión de l-bit” o “(k, l) -equidistribuido” que le remito a Google / pregunta de seguimiento si está interesado.

b) pruebas estadísticas
Tenga en cuenta que también hay pruebas estadísticas de aleatoriedad. Esto es particularmente útil cuando extraemos un pequeño subconjunto de los números aleatorios de un generador de números aleatorios, y tememos las pequeñas propiedades de muestra que pueden ser descuidadas por una visión macro tomada por las medidas de uniformidad mencionadas anteriormente.

Hay muchos tipos diferentes de tales pruebas. Algunos de ellos se basan en la comparación con resultados conocidos de cantidades aleatorias, como la prueba de cumpleaños de Marsaglia (¿recuerda el problema del cumpleaños?). Una prueba de permutación se da en el volumen 2 de TAOCP de Knuth (1998). Otras pruebas incluyen Kolmogorov-Smirnov y Anderson-Darling.

Como se mencionó, L’Ecuyer es un reconocido experto en el tema. Otra referencia puede ser Gentle, Generación de números aleatorios y métodos Monte Carlo (2003).

Lo primero a tener en cuenta es que para que una secuencia sea verdaderamente “aleatoria”, debe ser infinita. En informática, solo podemos imaginar secuencias infinitas como la salida de algún algoritmo, y luego, por definición, no será aleatorio.

Desde una perspectiva más matemática, hay tres definiciones “aleatorias” de aleatoriedad que resultan equivalentes ( http://en.wikipedia.org/wiki/Alg …). En realidad solo estoy familiarizado con los dos primeros enumerados allí 🙂

Una es la aleatoriedad de Kolmogorov ( http://en.wikipedia.org/wiki/Kol …), que en resumen mide la “complejidad” de una cadena de bits finita al hacer la pregunta “¿cuánto dura el programa más corto que generaría esta cadena? ? “. Para que una secuencia infinita sea aleatoria de Kolmogorov, todos sus segmentos iniciales finitos deben estar por encima de una cierta complejidad en relación con su longitud.

La otra es la aleatoriedad de Martin-Löf. Esto no es tan intuitivo, pero se puede considerar como “mi secuencia infinita tiene que satisfacer todas las fórmulas probabilísticas”. Por ejemplo, esperaríamos que en una secuencia aleatoria, 0 y 1 ocurran con la misma frecuencia; es decir, para una secuencia [matemáticas] a_0, a_1, \ ldots [/ matemáticas], esperaría que

[matemáticas] \ lim_ {n \ to \ infty} \ frac {| \ lbrace m

Resulta que hay infinitas fórmulas, llamadas “pruebas secuenciales efectivas” o “pruebas de Martin-Löf”, y que tienen una definición bastante clara, que es un poco profunda, pero se le da un gran tratamiento en http://math.uni-heidelberg.de/lo… .

De cualquier manera, resulta que cualquier secuencia enumerable de manera computable ( http://en.wikipedia.org/wiki/Rec …) no es aleatoria. Una consecuencia de esto es que dado que los dígitos de [math] e [/ math] y [math] \ pi [/ math] son ​​computablemente enumerables, de hecho no son aleatorios .

Si te interesan las matemáticas, la aleatoriedad es uno de esos campos que todavía tiene muchas preguntas abiertas en las que es realmente interesante pensar. Obtendría una buena base en la teoría de la computabilidad, primero, pero después de eso es bastante impresionante.

Paz,
-Arrendajo

More Interesting

¿Cómo funciona el algoritmo de sugerencia de seguimiento de Twitter?

¿Cuál es la complejidad del tiempo para una solución iterativa de la serie Fibonacci?

¿Cuáles son algunos algoritmos de aprendizaje automático que pueden ayudarme a encontrar las similitudes o diferencias entre las ideas textuales?

Cómo reconocer un problema como un problema de programación dinámica

¿Cuál es el significado de la complejidad en el algoritmo?

¿Cuáles son las mejores rutinas que podemos adoptar para ser buenos en la programación / diseño de algoritmos?

¿Es malo si no entiendo un algoritmo? He estado tratando de entender algunos algoritmos (los recursivos en su mayoría), entiendo la mayoría de ellos, pero no pude entender algunos.

¿Qué algoritmo puedo usar para generar enteros (pseudo) aleatorios con una duración de ciclo infinito?

Cómo diseñar un algoritmo de movimiento para un robot hexápodo

¿Cuáles serían las implicaciones si pudiera demostrar que he descifrado el algoritmo criptográfico RSA en tiempo polinómico? ¿Qué debería hacer después?

¿Qué ventajas tiene una ordenación por inserción sobre una ordenación por burbujas en la programación y por qué se ha propuesto?

¿Cómo podemos verificar de forma recursiva si una lista vinculada individualmente es un palíndromo?

¿Cuáles son algunos conceptos que debo saber antes de aprender programación dinámica?

¿Cómo podemos generar k enteros aleatorios únicos en el rango [1 ... n] con igual probabilidad?

¿Por qué usamos algoritmos?