Un algoritmo PRNG (generador de números aleatorios) correcto 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.
A PRNG simple que hace esto se llama el 'Linear Congruential' PRNG que itera una fórmula:
X(i) = AX(i-1)|M
Usando el par de factores puede obtener un periodo de 2^30 (aproximadamente 1 mil millones) de un PRNG simple 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 podemos obtener los valores de A a continuación para obtener un PRNG con un largo período (2^30 IIRC).
buenos valores de A:
742,938,285
950,706,376
1,226,874,159
62,089,911
1,343,714,438
en cuenta que este tipo de generador es (por definición) no 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 prediga 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, el mismo se puede decir de los generadores de periodo largo como el Mersenne Twister.
Tuve que -1 porque la lógica detrás de esta pregunta es defectuosa. – UnkwnTech
¿Podría agregar por qué no quiere usar un campo de autoincrement simple? – staticsan
No puedo determinar si esto es aleatorio o simplemente único y no secuencial. No puedo entender lo que user_id tiene que ver con nada. Y no entiendo lo que 9.999.999 tiene que ver con nada. –