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.
- ¿Cuál es el mejor algoritmo de extracción en primer plano de escenas dinámicas, donde el fondo también puede cambiar (debido a las vibraciones de la cámara o los detalles en movimiento)?
- En los primeros días de la informática, ¿por qué tenían que implementar memoria de núcleo de ferrita en lugar de utilizar conjuntos de condensadores?
- ¿Es importante memorizar algoritmos?
- ¿Cómo pruebo que un tipo de matriz N de longitud basada en comparación no se puede hacer en tiempo O (N) en el peor de los casos?
- Cómo saber si / cuándo puede aplicar la manipulación de bits para resolver un problema
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.