Necesito un generador pseudoaleatorio que toma un número como entrada y devuelve otro número que es reproducible y parece ser aleatorio.Algoritmo pseudoaleatorio simple
- Cada número de entrada debe coincidir exactamente con un número de salida y viceversa
- mismos números de entrada siempre resultar en mismos números de salida
- números de entrada secuenciales que están muy juntos (por ejemplo. 1 y 2) debe producir números de salida completamente diferentes (por ejemplo, 1 => 9783526, 2 => 283)
No debe ser perfecto, es solo para crear datos de prueba aleatorios pero reproducibles.
Uso C#.
Escribí esta pieza graciosa de código hace algún tiempo que producía algo al azar.
public static long Scramble(long number, long max)
{
// some random values
long[] scramblers = { 3, 5, 7, 31, 343, 2348, 89897 };
number += (max/7) + 6;
number %= max;
// shuffle according to divisibility
foreach (long scrambler in scramblers)
{
if (scrambler >= max/3) break;
number = ((number * scrambler) % max)
+ ((number * scrambler)/max);
}
return number % max;
}
Me gustaría tener algo mejor, más confiable, trabajando con cualquier tamaño de número (sin argumento máximo).
¿Podría esto probablemente resolverse usando un algoritmo CRC? O algo de barajar.
Quiere una función hash. – phoku
Duplo de http://stackoverflow.com/questions/239063 – sbi
@sbi: no estoy seguro de que este sea un duplicado exacto, dado el requisito de correspondencia exclusiva entre entrada y salida. Ver el comentario de 'tanascius' en mi respuesta a continuación. – MusiGenesis