Un generador de números pseudoaleatorios ( PRNG ), también conocido como generador de bits aleatorios determinista ( DRBG ), [1] es un algoritmo para generar una secuencia de números cuyas propiedades se aproximan a las propiedades de las secuencias de números aleatorios . La secuencia generada por PRNG no es verdaderamente aleatoria , porque está completamente determinada por un valor inicial, llamado semilla del PRNG (que puede incluir valores verdaderamente aleatorios). Aunque las secuencias que están más cerca de ser verdaderamente aleatorias se pueden generar utilizando generadores de números aleatorios de hardware , los generadores de números pseudoaleatorios son importantes en la práctica por su velocidad en la generación de números y su reproducibilidad. [2]
Los PRNG son fundamentales en aplicaciones como simulaciones (por ejemplo, para el método Monte Carlo ), juegos electrónicos (por ejemplo, para generación procedimental ) y criptografía . Las aplicaciones criptográficas requieren que el resultado no sea predecible a partir de resultados anteriores, y se necesitan algoritmos más elaborados , que no hereden la linealidad de los PRNG más simples.
Las buenas propiedades estadísticas son un requisito central para el resultado de un PRNG. En general, se requiere un análisis matemático cuidadoso para tener la certeza de que un PRNG genera números que son lo suficientemente cercanos a la aleatoriedad como para adaptarse al uso previsto. John von Neumann advirtió sobre la mala interpretación de un PRNG como un generador verdaderamente aleatorio, bromeando que "cualquiera que considere métodos aritméticos para producir dígitos aleatorios está, por supuesto, en un estado de pecado". [3]
En la práctica, los resultados de muchos PRNG comunes presentan artefactos que hacen que no superen las pruebas de detección de patrones estadísticos. Entre ellos se incluyen los siguientes:
Los defectos que presentan los PRNG defectuosos varían desde imperceptibles (y desconocidos) hasta muy obvios. Un ejemplo fue el algoritmo de números aleatorios RANDU , utilizado durante décadas en los ordenadores centrales . Tenía graves defectos, pero su inadecuación pasó desapercibida durante mucho tiempo.
En muchos campos, los trabajos de investigación anteriores al siglo XXI que se basaban en la selección aleatoria o en simulaciones de Monte Carlo , o que dependían de otros modos de PRNG, eran mucho menos fiables de lo ideal como resultado del uso de PRNG de mala calidad. [4] Incluso hoy en día, a veces se requiere precaución, como lo ilustra la siguiente advertencia en la Enciclopedia Internacional de Ciencias Estadísticas (2010). [5]
La lista de generadores de uso generalizado que se deben descartar es mucho más larga [que la lista de buenos generadores]. No confíe ciegamente en los proveedores de software. Compruebe el generador de números aleatorios predeterminado de su software favorito y esté preparado para reemplazarlo si es necesario. Esta última recomendación se ha hecho una y otra vez durante los últimos 40 años. Tal vez sea sorprendente que siga siendo tan relevante hoy como lo fue hace 40 años.
A modo de ejemplo, pensemos en el lenguaje de programación ampliamente utilizado Java . Hasta 2020, Java todavía dependía de un generador congruencial lineal (LCG) para su PRNG, [6] [7] que es de baja calidad (véase más adelante). El soporte de Java se actualizó con Java 17 .
Un PRNG conocido que evita problemas mayores y aún así funciona con bastante rapidez es el Mersenne Twister (discutido más adelante), que se publicó en 1998. Otros PRNG de mayor calidad, tanto en términos de rendimiento computacional como estadístico, se desarrollaron antes y después de esta fecha; estos se pueden identificar en la Lista de generadores de números pseudoaleatorios .
En la segunda mitad del siglo XX, la clase estándar de algoritmos utilizados para los PRNG comprendía los generadores congruenciales lineales . Se sabía que la calidad de los LCG era inadecuada, pero no había métodos mejores disponibles. Press et al. (2007) describieron el resultado de esta manera: "Si todos los artículos científicos cuyos resultados están en duda debido a [LCG y relacionados] desaparecieran de los estantes de las bibliotecas, habría un hueco en cada estante aproximadamente tan grande como su puño". [8]
Un avance importante en la construcción de generadores pseudoaleatorios fue la introducción de técnicas basadas en recurrencias lineales en el campo de dos elementos; dichos generadores están relacionados con los registros de desplazamiento de retroalimentación lineal .
La invención en 1997 del Mersenne Twister , [9] en particular, evitó muchos de los problemas con los generadores anteriores. El Mersenne Twister tiene un período de 2 19 937 − 1 iteraciones (≈ 4,3 × 10Se ha demostrado que 6001 está equidistribuido en (hasta) 623 dimensiones (para valores de 32 bits) y en el momento de su introducción funcionaba más rápido que otros generadores estadísticamente razonables.
En 2003, George Marsaglia introdujo la familia de generadores xorshift [10] , nuevamente basados en una recurrencia lineal. Estos generadores son extremadamente rápidos y, combinados con una operación no lineal, superan pruebas estadísticas rigurosas. [11] [12] [13]
En 2006, se desarrolló la familia de generadores WELL . [14] Los generadores WELL en algunos aspectos mejoran la calidad del Mersenne Twister, que tiene un espacio de estados demasiado grande y una recuperación muy lenta de espacios de estados con una gran cantidad de ceros.
Un PRNG adecuado para aplicaciones criptográficas se denomina PRNG criptográficamente seguro (CSPRNG). Un requisito para un CSPRNG es que un adversario que no conozca la semilla tenga solo una ventaja insignificante para distinguir la secuencia de salida del generador de una secuencia aleatoria. En otras palabras, mientras que un PRNG solo debe pasar ciertas pruebas estadísticas, un CSPRNG debe pasar todas las pruebas estadísticas que están restringidas al tiempo polinomial en el tamaño de la semilla. Aunque una prueba de esta propiedad está más allá del estado actual del arte de la teoría de la complejidad computacional , se puede proporcionar una evidencia sólida al reducir al CSPRNG a partir de un problema que se supone que es difícil , como la factorización de números enteros . [15] En general, pueden requerirse años de revisión antes de que un algoritmo pueda certificarse como un CSPRNG.
Algunas clases de CSPRNG incluyen las siguientes:
Se ha demostrado que es probable que la NSA haya insertado una puerta trasera asimétrica en el generador de números pseudoaleatorios certificado por el NIST Dual_EC_DRBG . [19]
La mayoría de los algoritmos PRNG producen secuencias que se distribuyen uniformemente mediante cualquiera de varias pruebas. Es una pregunta abierta, y central para la teoría y la práctica de la criptografía , si existe alguna forma de distinguir la salida de un PRNG de alta calidad de una secuencia verdaderamente aleatoria. En este contexto, el distinguidor sabe que se utilizó el algoritmo PRNG conocido (pero no el estado con el que se inicializó) o se utilizó un algoritmo verdaderamente aleatorio, y tiene que distinguir entre los dos. [20] La seguridad de la mayoría de los algoritmos y protocolos criptográficos que utilizan PRNG se basa en el supuesto de que es inviable distinguir el uso de un PRNG adecuado del uso de una secuencia verdaderamente aleatoria. Los ejemplos más simples de esta dependencia son los cifrados de flujo , que (la mayoría de las veces) funcionan mediante la combinación exclusiva o -ing del texto simple de un mensaje con la salida de un PRNG, produciendo un texto cifrado . El diseño de PRNG criptográficamente adecuados es extremadamente difícil porque deben cumplir criterios adicionales. El tamaño de su período es un factor importante en la idoneidad criptográfica de un PRNG, pero no el único.
La Oficina Federal Alemana para la Seguridad de la Información ( Bundesamt für Sicherheit in der Informationstechnik , BSI) ha establecido cuatro criterios de calidad para los generadores de números aleatorios deterministas. [21] Se resumen aquí:
Para aplicaciones criptográficas, solo son aceptables los generadores que cumplan con los estándares K3 o K4.
Dado:
Llamamos a una función (donde es el conjunto de números enteros positivos) un generador de números pseudoaleatorios para los valores dados que toman en si y solo si :
( denota el número de elementos en el conjunto finito .)
Se puede demostrar que si es un generador de números pseudoaleatorios para la distribución uniforme en y si es la CDF de alguna distribución de probabilidad dada , entonces es un generador de números pseudoaleatorios para , donde es el percentil de , es decir . Intuitivamente, se puede simular una distribución arbitraria a partir de una simulación de la distribución uniforme estándar.
Un PRNG basado en computadora temprano, sugerido por John von Neumann en 1946, se conoce como el método del cuadrado medio . El algoritmo es el siguiente: tome cualquier número, elévelo al cuadrado, elimine los dígitos del medio del número resultante como el "número aleatorio", luego use ese número como semilla para la siguiente iteración. Por ejemplo, elevar al cuadrado el número "1111" da como resultado "1234321", que se puede escribir como "01234321", un número de 8 dígitos que es el cuadrado de un número de 4 dígitos. Esto da "2343" como el número "aleatorio". Repitiendo este procedimiento da "4896" como el siguiente resultado, y así sucesivamente. Von Neumann usó números de 10 dígitos, pero el proceso fue el mismo.
Un problema con el método del "cuadrado medio" es que todas las secuencias terminan repitiéndose, algunas muy rápidamente, como "0000". Von Neumann era consciente de esto, pero consideró que el método era suficiente para sus propósitos y le preocupaba que las "correcciones" matemáticas simplemente ocultaran los errores en lugar de eliminarlos.
Von Neumann consideró que los generadores de números aleatorios de hardware no eran adecuados, ya que, si no registraban el resultado generado, no se podían comprobar posteriormente en busca de errores. Si registraban el resultado, agotarían las limitadas memorias informáticas disponibles en ese momento y, por lo tanto, la capacidad de la computadora para leer y escribir números. Si los números se escribían en tarjetas, tardarían mucho más en escribirse y leerse. En la computadora ENIAC que estaba utilizando, el método del "cuadrado medio" generaba números a una velocidad unas cien veces más rápida que la lectura de números de tarjetas perforadas .
El método del cuadrado medio ha sido reemplazado desde entonces por generadores más elaborados.
Una innovación reciente es combinar el cuadrado medio con una secuencia de Weyl . Este método produce resultados de alta calidad a lo largo de un período largo (véase el método del cuadrado medio ).
Los números seleccionados de una distribución de probabilidad no uniforme se pueden generar utilizando un PRNG de distribución uniforme y una función que relaciona las dos distribuciones.
En primer lugar, se necesita la función de distribución acumulativa de la distribución objetivo :
Tenga en cuenta que . Si utilizamos un número aleatorio c de una distribución uniforme como densidad de probabilidad para "pasar de largo", obtenemos
de modo que
es un número seleccionado aleatoriamente de la distribución . Esto se basa en el muestreo por transformada inversa .
Por ejemplo, la inversa de la distribución gaussiana acumulativa con un PRNG uniforme ideal con rango (0, 1) como entrada produciría una secuencia de valores (solo positivos) con una distribución gaussiana; sin embargo
Consideraciones similares se aplican a la generación de otras distribuciones no uniformes, como Rayleigh y Poisson .