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

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

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

(Брутфорсинг не вариант, если это не сравнительно быстро (несколько секунд).)

5
задан strager 26 August 2010 в 04:55
поделиться