¿Cuál es el algoritmo generador de números aleatorios más avanzado disponible ahora?

Para los PRNG estándar, yo diría que PCG y xoroshiro128 + son los líderes. En esta área, las principales medidas son el rendimiento, la calidad estadística, la simplicidad y la estandarización / popularidad. Mersenne Twister (MT) sigue siendo una opción muy común, no es una mala opción, y tiene algunas buenas ventajas. Pero en términos de calidad estadística, carece de los PRNG más recientes y más avanzados, por así decirlo.

Si uno se rinde muy poco en rendimiento y mucho en simplicidad, los CSPRNG tienen bastantes ventajas. Los líderes aquí son ChaCha20 y AES-CTR. Ambos proporcionan una excelente salida aleatoria. ChaCha20 está siendo adoptado por muchos proyectos de software (por ejemplo, / dev / urandom en Linux / OpenBSD / NetBSD y más). Es bastante rápido en C simple y tiene versiones SIMD (por ejemplo, AVX) que se ejecutan sustancialmente más rápido. AES en modo contador es muy lento en C simple, pero muchas CPU ofrecen primitivas AES ahora que lo hacen increíblemente rápido.

Chacha20 es relativamente simple, está bien documentado y tiene muchas suites de prueba para cada paso disponible. Escribí una versión C que, como era de esperar, es bastante similar a las versiones C estándar de la mayoría de las personas que he visto, ya que solo está implementando el algoritmo básico. Ahora está disponible para su uso en Perl, y hay muy poca pérdida de rendimiento en comparación con los PRNG estándar (en realidad es más rápido que la mayoría de los módulos que no son CSPRNG). Si agrego una de las implementaciones de AVX2 que están flotando, probablemente las superaría.

Para números verdaderamente aleatorios, ideales para la generación de claves y necesarios para la siembra, es complicado y probablemente una pregunta diferente. Por lo general, esto es mejor dejarlo al sistema operativo, donde se mezclan varias fuentes de hardware utilizando métodos conocidos de grupo de entropía.

Tenga en cuenta que cosas como la construcción de semillas y la resiembra están separadas del algoritmo RNG real, y no son realmente parte de la diferencia PRNG vs. CSPRNG. Sin embargo, es crítico para la operación adecuada del sistema. Se requiere que un CSPRNG tenga excelentes propiedades estadísticas, pero ese también es un objetivo de los PRNG (aunque no es un requisito difícil). Lo más importante es cómo se trata el estado. Muchas aplicaciones informáticas no son adversas, por ejemplo, la mayoría de las simulaciones científicas no tienen los bosques simulados jugando activamente con el RNG, por lo que obtienen más agua. Por lo tanto, proteger el estado y garantizar la seguridad de predicción inversa bajo pérdida de estado es un desperdicio. No duele, pero hace las cosas más complicadas y típicamente más lentas.

En Windows, de acuerdo con la documentación disponible, CryptGenRandom realiza la recopilación de entropía y acepta entradas adicionales que se mezclan para dar a cada persona que llama una secuencia única. Luego usa AES-CTR en versiones modernas. XP y Vista pre-SP1 utilizaron un método SHA1-CTR. Ambos deberían proporcionar una salida excelente, similar a / dev / urandom en Linux.

Hay una clase de generadores de números aleatorios a los que me he referido como ‘generadores criptográficos de números aleatorios’. Estos van más allá de los comportamientos normales de los generadores de números pseudoaleatorios para tratar de inyectar fuentes externas de entropía en la secuencia de números aleatorios, lo que hace menos probable que la secuencia sea predecible. He visto implementaciones de estas funciones que indican al salir si la función pudo generar un número ‘suficientemente aleatorio’. En otras palabras, si se satisfacían sus requisitos para la entropía proporcionada externamente.

El enlace wiki anterior proporciona una buena visión general de los generadores criptográficos de números aleatorios. Si usa Windows, puede usar CryptGenRandom o su equivalente administrado. Según lo que leí, Microsoft no ha publicado el algoritmo que usan. Sin embargo, eso no evita que lo consumas.

Tomé 10 algoritmos diferentes y dejé que la computadora usara uno de ellos para seleccionar “al azar” uno de los otros 9, y este seleccionado al azar produce un número. ahora no sé qué algoritmo solía darme el número aleatorio. Por supuesto, esto se puede rastrear, pero lo hace algo aleatorio para todos los medios y propósitos prácticos.