Мне нужен генератор псевдослучайных чисел, который принимает число в качестве входных данных и возвращает другое число, которое воспроизводимо и кажется случайным.
- Каждый входной номер должен соответствовать ровно одному выходному номеру, и наоборот
- одинаковые входные номера всегда приводят к одинаковым выходным номерам
- номера последовательных входов, которые расположены близко друг к другу (например, 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? Или что-то вроде тасования.