Knuth cubre muy bien el tema de la aleatoriedad.
Realmente no entendemos bien al azar. ¿Cómo puede algo predecible ser aleatorio? Y, sin embargo, las secuencias pseudoaleatorias pueden parecer perfectamente al azar mediante pruebas estadísticas.
Hay tres categorías de generadores aleatorios, que se amplifican en el comentario anterior.
En primer lugar, tiene generadores de números pseudoaleatorios donde si conoce el número aleatorio actual, es fácil calcular el siguiente. Esto facilita la ingeniería inversa de otros números si descubre algunos.
Luego, hay algoritmos criptográficos que hacen esto mucho más difícil. Creo que todavía son secuencias pseudoaleatorias (a diferencia de lo que implica el comentario anterior), pero con la muy importante propiedad de que saber algunos números en la secuencia NO hace que sea obvio cómo calcular el resto. La forma en que funciona es que las rutinas criptográficas tienden a aumentar el número, de modo que si un bit cambia, es probable que cada bit cambie como resultado.
Considere un generador de módulo sencillo (similar a algunas implementaciones en rand C())
int rand() { retorno semilla = semilla * m + a; }
si m = 0 y a = 0, esto es un generador de pésimo con período de 1: 0, 0, 0, 0, .... si m = 1 y a = 1, sino que también no es muy al azar: 0, 1, 2, 3, 4, 5, 6, ...
Pero si elige m y a para ser números primos alrededor de 2^16, esto saltará muy bien buscando muy al azar si están inspeccionando casualmente Pero debido a que ambos números son impares, verá que el bit bajo se alternaría, es decir, el número es alternativamente impar y par. No es un gran generador de números aleatorios. Y dado que solo hay 2^32 valores en un número de 32 bits, por definición después de 2^32 iteraciones como máximo, repetirá la secuencia nuevamente, lo que hace obvio que el generador NO es aleatorio.
Si considera que los bits medios son agradables y codificados, mientras que los inferiores no son tan aleatorios, entonces puede construir un generador de números aleatorios mejor con algunos de estos, con los diversos bits unidos juntos para que XOR todos los bits están bien cubiertos. Algo así como:
(rand1() >> 8)^rand2()^(rand3()> 5) ...
Sin embargo, cada número está volteando en sincronía, lo que hace que este predecible. Y si obtienes dos valores secuenciales, están correlacionados, de modo que si los tratas obtendrás líneas en tu pantalla. Ahora imagina que tienes reglas que combinan los generadores, de modo que los valores secuenciales no sean los siguientes. Por ejemplo
v1 = rand1() >> 8^rand2() ... v2 = rand2() >> 8^rand5() ..
e imagina que las semillas no siempre avanzan. Ahora está empezando a hacer algo que es mucho más difícil de predecir basándose en ingeniería inversa, y la secuencia es más larga.
Por ejemplo, si calcula rand1() cada vez, pero solo avanza la semilla en rand2() cada 3ª vez, un generador que las combine podría no repetirse durante mucho más tiempo que el período de cualquiera de las dos.
Ahora imagine que bombea su generador de números aleatorios (bastante predecible) a través de DES o algún otro algoritmo de encriptación. Eso acelerará los bits.
Obviamente, hay mejores algoritmos, pero esto le da una idea. Numerical Recipes tiene muchos algoritmos implementados en el código y explicados. Un muy buen truco: generar no uno, sino un bloque de valores aleatorios en una tabla. Luego use un generador de números aleatorios independiente para elegir uno de los números generados, genere uno nuevo y reemplácelo. Esto rompe cualquier correlación entre pares adyacentes de números.
La tercera categoría es generadores de números aleatorios reales basadas en hardware, por ejemplo a base de ruido atmosférico
http://www.random.org/randomness/
Esto es, según la ciencia actual, verdaderamente aleatoria. Quizás algún día descubramos que obedece a alguna regla subyacente, pero actualmente, no podemos predecir estos valores, y son "verdaderamente" aleatorios en lo que a nosotros respecta.
La biblioteca de impulso tiene excelentes implementaciones en C++ de generadores de Fibonacci, los reyes reinantes de secuencias pseudoaleatorias si desea ver algún código fuente.
Buscar - ya hay docenas de respuestas a esta pregunta. – RogerG
aquí hay otro tema que cubre la solicitud de la implementación as3 de random.next: http://stackoverflow.com/questions/3930291/actionscript-3-implementation-of-random-next También hay fragmentos de código dentro de –
@RogerG> ¿Tienes un enlace para compartir? Porque no vi ningún ... @hacticks> muchas gracias – naveen