Generar números aleatorios no es fácil para los ordenadores, inherentemente deterministas. Por eso se trabaja en algoritmos que permitan generarlos cumpliendo con diferentes definiciones de aleatoriedad y a la vez ciertas premisas: que no requieran mucha memoria, que el código sea rápido y no demasiado complejo y que los resultados sean «reproducibles» (por ejemplo en simulaciones). Esto último es en cierto modo un poco paradójico, pero es así como funcionan: una vez iniciado un generador con un valor dado debería generar siempre la misma secuencia.
En la página dedicada a la familia PCG de generadores de números aleatorios hay una interesante tabla que muestra todas estas características para los diversos algoritmos que se utilizan habitualmente: Mersenne, ARC4Random, LCG 64/32, XorShift 32/64, RanQ… El propio PCG, explicado en este paper dice ser una solución que cubre con todas las necesidades:
El nombre de la familia, PCG, significa generador congruente permutable. Combina los dos conceptos que subyacen en el esquema de generación, a saber: las funciones de permutación en tuplas y se emplea un generador congruente lineal.
Toda la documentación y el blog que está en esa misma página son interesantes para entender algunos de los problemas actuales: que los generadores de números aleatorios no son suficientemente aleatorios, que algunos son demasiado predecibles o inseguros, lentos o que no tienen funciones que serían muy útiles como el «saltar hacia adelante» (jump ahead). El código está disponible en C y C++.
Las aplicaciones de los generadores de números aleatorios van mucho más allá …