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.
- ¿Cómo se puede ser bueno para resolver problemas de algoritmos / programación? Soy un principiante, y me sugirieron que leyera el libro CLRS para aprender sobre algoritmos.
- Procesamiento de lenguaje natural: ¿Cuál es la mejor manera de detectar si un fragmento de texto es interrogativo?
- ¿Qué algoritmo se usa para la predicción de abandono?
- ¿Cuáles son algunos ejemplos de colas de prioridad en Java?
- ¿Cuál es un buen algoritmo de hash para identificar de forma exclusiva una URL en una base de datos?
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).