Мне нужен псевдослучайный генератор, который принимает число в качестве входных данных и возвращает другое число, которое воспроизводится и кажется случайным.Простой псевдо-случайный алгоритм
- Каждый номер входа должен соответствовать ровно один номер выхода и наоборот
- же входные числа всегда приводят те же номера выходов
- последовательные номера ввода, которые близко друг к другу (например, 1 и 2) следует производить совершенно разные номера выходных данных (например, 1 => 9783526, 2 => 283)
Это не должно быть идеальным, это просто создать случайные, но воспроизводимые данные испытаний.
Я использую C#.
Некоторое время назад я написал эту забавную часть кода, которая произвела что-то случайное.
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;
}
Я хотел бы иметь что-то лучшее, более надежное, работая с любым размером номера (без аргумента max).
Возможно, это возможно решить с помощью алгоритма CRC? Или немного перетасовать вещи.
Вы хотите функцию хеша. – phoku
Dup of http://stackoverflow.com/questions/239063 – sbi
@sbi: не уверен, что это точный дубликат, учитывая требование для эксклюзивного соответствия между входом и выходом. См. Комментарий tanascius по моему ответу ниже. – MusiGenesis