Potrzebuję pseudolosowego generatora, który pobiera numer jako dane wejściowe i zwraca inny numer, który jest powtarzalny i wydaje się losowy.Prosty algorytm pseudolosowy
- Każdy numer wejścia powinny pasować dokładnie do jednej liczby wyjściowej i vice versa
- same liczby wejściowych zawsze prowadzić samymi wyjściowych
- kolejne numery wejściowych, które znajdują się blisko siebie (np. 1 i 2), powinien wywoływać zupełnie inne liczby wyjściowe (np. 1 => 9783526, 2 => 283)
To nie może być doskonałe, tylko tworzyć losowe, ale odtwarzalne dane testowe.
Używam C#.
Napisałem ten zabawny kawałek kodu, który jakiś czas temu wyprodukował coś przypadkowego.
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;
}
Chciałbym mieć coś lepszego, bardziej niezawodnego, pracującego z dowolnym rozmiarem numeru (brak argumentu max).
Czy można to prawdopodobnie rozwiązać za pomocą algorytmu CRC? Lub trochę szurania rzeczy.
Chcesz funkcję skrótu. – phoku
Dup of http://stackoverflow.com/questions/239063 – sbi
@sbi: nie jestem pewien, że jest to dokładny duplikat, biorąc pod uwagę wymóg wyłącznej zgodności między wejściem i wyjściem. Zobacz komentarz 'tanascius' na moją odpowiedź poniżej. – MusiGenesis