Мне нужно построить генератор псевдослучайных чисел на месте с регулируемым периодом. Кроме того, в течение одного периода не должно быть никаких столкновений. То есть, следующий должен возвращать верно:PRNG с регулируемым периодом
// prng is "generated" at run-time
// (though a by-hand solution would work)
bool test(func prng, int period) {
int seed = 0; // Any number should work
int cur = seed;
for (int i = 0; i <= period; ++i) {
cur = prng(cur);
if (cur == seed) {
if (i == period) {
// We hit our period on target
return true;
}
// Period too low (we hit our seed already!)
return false;
}
}
// Period too high
return false;
}
(пример псевдокод, ответ в любом широко читаемом языке (C++, Python, Haskell и т.д.) является приемлемым.)
ПСЧ должен а не зависят от изменяемого статического состояния при генерации чисел. То есть, у меня не может быть большой таблицы уже возвращенных чисел или чего-то подобного. Он должен полагаться только на данный ввод для генерации следующего термина.
Алгоритм не должен быть криптографически сильным (конечно) или «сильно» случайным. Однако x % period
неприемлем; он должен быть как минимум несколько случайный.
Я изучал линейные конгруэнтные генераторы, но это, по-видимому, неправильный путь для моих конкретных ограничений.
(Brute форсирования не вариант, если это не относительно быстро (несколько секунд).)