Por @Alvy — 31 de Agosto de 2008

Los números aleatorios generados por ordenador utilizando las funciones habituales de los diversos lenguajes de programación son en realidad pseudo-aleatorios. Más o menos se conoce cuales de estas funciones son mejores, peores o cuales fallan a veces. En la práctica se usan aunque disten de ser perfectas, normalmente por cuestiones de velocidad o practicidad.

Bo Allen escribe en Pseudo-Random vs. True Random sobre una bella demostración visual del problema, creando un gráfico estilo «nieve» con números aleatorios obtenidos de Random.org por un lado, frente a otros utilizando la función rand() de PHP.

Pseudo-aleatorios

Los patrones visuales que aparecen al usar rand() no deberían estar ahí. Obviamente serían mucho más difíciles de descubrir en otros escenarios: datos aleatorios para simulaciones estadísticas, juegos, mezclas de barajas de cartas y demás. Pero son producto de la función elegida para crear valores aleatorios, como muestra inequívocamente la imagen del mapa de bits.

Este problema también tiene su lado bueno, y haciendo válido aquel dicho informático de que «todo bug puede llear a ser una feature» se utiliza a menudo para obtener secuencias aleatorias partiendo de un valor incial («semilla») de modo que la secuencia obtenida sea siempre la misma, lo cual puede tener muchas aplicaciones.

La utilización de estas funciones pseudo-aleatorias «débiles» puede dar lugar, por ejemplo, a problemas de seguridad importantes. Existen alternativas exóticas como usar un generador cuántico de bits aleatorios, que a menos que realmente no exista la aleatoriedad en el mundo físoco –cuestión filosófica más que otra cosa– parecen ser más seguros.

Un truco simple y de andar por casa, para conseguir un poco más de aleatoriedad en PHP es usar mt_rand(), o bien llamar a srand() antes de usar rand(). Esto modifica el «valor semilla» de rand() y se puede hacer con el valor del reloj, o combinándolo con números de naturaleza similares, de origen algo más aleatorio (ej. tiempo de una consulta a una base de datos –con toda la precisión posible–, las coordenadas del ratón, tiempo entre teclas pulsadas, etcétera), que modifiquen la semilla de la secuencia. (A partir de PHP 4.2 esto ya no es necesario, pues se hace automáticamente).

A título personal, una prueba similar que hice dibujando en el BASIC de Commodore allá en los tiempos jurásicos producía patrones similares en la pantalla: líneas diagonales en aquella primitiva matriz de 40×25. Tras el profundo WTF inicial que me produjo me descubrió este más que curioso efecto sobre la naturaleza de las funciones de generación de números aleatorios.

Compartir en Flipboard Publicar / Tuitear