PRNG с регулируемым периодом

Мне нужно создать на месте генератор псевдослучайных чисел с регулируемым периодом. Кроме того, в течение одного периода не должно быть столкновений. То есть следующее должно возвращать 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 долженне&nbsp;зависит от изменяемого статического состояния при генерации чисел. То есть у меня не может быть большой таблицы уже возвращенных чисел или чего-то в этом роде. Он должен полагаться только на данные входные данные для генерации следующего члена.

Алгоритм не обязательно должен быть криптографически сильным (конечно) или «сильно» случайным. Тем не мение,x % period&nbsp;не приемлемо; это должно быть по крайней мерев некотором роде&nbsp;случайным образом.

Я изучил линейные конгруэнтные генераторы, но это, кажется, неправильный путь для моих конкретных ограничений.

(Перебор не возможен, если он не является относительно быстрым (несколько секунд).)