Un algoritmo PRNG (generador de números aleatorios) adecuado tendrá un tiempo de ciclo durante el cual nunca estará en el mismo estado. Si expone el estado completo del PRNG en el número obtenido de él, obtendrá un número garantizado único para el período del generador.
Un simple PRNG que hace esto se llama PRNG ' lineal congruente ' que itera una fórmula:
X(i) = AX(i-1)|M
Usando el par de factores correctos puede obtener un período de 2 ^ 30 (aproximadamente 1 mil millones) a partir de un simple PRNG con un acumulador de 32 bits. Tenga en cuenta que necesitará una variable temporal larga larga de 64 bit para mantener la parte intermedia 'AX' del cálculo. La mayoría, si no todos, los compiladores de C admitirán este tipo de datos. También debería poder hacerlo con un tipo de datos numéricos en la mayoría de los dialectos SQL.
Con los valores correctos de A y M podemos obtener un generador de números aleatorios con buenas propiedades estadísticas y geométricas. Hay un famoso artículo sobre esto escrito por Fishman y Moore.
Para M = 2 ^ 31 - 1 obtenemos que podemos usar los valores de A a continuación para obtener un PRNG con un buen período largo (2 ^ 30 IIRC).
Buenos valores de A:
742,938,285
950,706,376
1,226,874,159
62,089,911
1,343,714,438
Tenga en cuenta que este tipo de generador (por definición) no es criptográficamente seguro. Si conoce el último número generado a partir de él, puede predecir qué hará a continuación. Lamentablemente, creo que no se puede obtener seguridad criptográfica y no repetibilidad garantizada al mismo tiempo. Para que un PRNG sea criptográficamente seguro (por ejemplo, Blum Blum Shub ) no puede exponer el estado suficiente en un número generado para permitir que se pronostique el siguiente número en la secuencia. Por lo tanto, el estado interno es más amplio que el número generado y (para tener una buena seguridad) el período será más largo que el número de valores posibles que se pueden generar. Esto significa que el número expuesto no será único dentro del período.
Por razones similares, lo mismo puede decirse de los generadores de período largo como el Mersenne Twister.