Mi serve un generatore pseudo-casuale che prende un numero come input e restituisce un altro numero che è riproducibile e sembra casuale.Algoritmo pseudo-casuale semplice
- Ogni numero di ingresso deve corrispondere esattamente a un numero di uscita e viceversa
- stessi numeri di ingresso risultare sempre in numero di uscita stesse
- numeri di ingresso sequenziali che sono vicine tra loro (es. 1 e 2) dovrebbe produrre numeri di uscita completamente diversi (ad esempio 1 => 9783526, 2 => 283)
Non deve essere perfetto, è solo per creare dati di test casuali ma riproducibili.
Io uso C#.
Ho scritto questo divertente pezzo di codice qualche tempo fa che ha prodotto qualcosa di casuale.
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;
}
Mi piacerebbe avere qualcosa di meglio, più affidabile, lavorando con tutto il formato del numero (nessun argomento max).
Questo potrebbe essere risolto utilizzando un algoritmo CRC? O roba un po 'trascinante.
Si desidera una funzione hash. – phoku
Dup di http://stackoverflow.com/questions/239063 – sbi
@sbi: non è sicuro che si tratta di un duplicato esatto, dato il requisito per la corrispondenza esclusiva tra input e output. Vedi il commento di tanascius sulla mia risposta qui sotto. – MusiGenesis