Мне нужно создать генератор псевдослучайных чисел на месте с регулируемым периодом. Кроме того, в течение одного периода не должно быть столкновений. То есть следующее должно возвращать true:
// 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 и т. Д.) Приемлем.)
PRNG не должен не ] зависит от изменчивого статического состояния при генерации чисел. То есть у меня не может быть большой таблицы уже возвращенных чисел или чего-то в этом роде. Он должен полагаться только на заданный вход для генерации следующего члена.
Алгоритм не обязательно должен быть криптографически сильным (конечно) или «сильно» случайным. Однако x% периода
неприемлемы; он должен быть по крайней мере несколько случайным.
Я изучал линейные конгруэнтные генераторы, но это, кажется, неправильный путь для моих конкретных ограничений.
(Брутфорсинг не вариант, если это не сравнительно быстро (несколько секунд).)