Как я могу определить период моего генератора псевдослучайных чисел?

14

Предположим, я использую линейный конгруэнтный генератор псевдослучайных чисел (PRNG). Учитывая начальное число , коэффициент умножения (a), коэффициент сдвига (c) и коэффициент модуля (m), как я могу определить период моего PRNG? Я определяю это с помощью экспериментов / алгоритмов обнаружения паттернов, или есть прямая формула для расчета его периода? x0

Хотя мой вопрос касается именно линейного конгруэнтного метода, я открыт для того, чтобы узнать больше о том, как на практике рассчитываются периоды для других ГСЧП.

Пол
источник
Соответствующий: en.wikipedia.org/wiki/...
Кстати, если вы используете LFSR, то период максимален, если полином обратной связи примитивен . В таком случае период AFAIK (не цитируйте меня; слишком ленив, чтобы выкопать мои заметки о курсе) равен где полином обратной связи p ( x ) F q [ x ] степени n , а q - размер поле коэффициентов. qnp(x)Fq[x]nq
2
Алгоритмы обнаружения циклов Флойда, а также алгоритмы обнаружения циклов Брента являются эффективными способами обнаружения циклов. Оба вернут несколько кратных L периода, и как только у вас это получится, вы можете разложить L и посмотреть, какой из факторов наименьший за период.
xdavidliu

Ответы:

12

Если вы ограничиваете себя сжиженным газом полного цикла, то ответ прост, по определению это просто m . м

Чтобы найти период не полного цикла LCN PRNG для данного начального числа, вам просто нужно посчитать количество итераций PRNG, пока он не сгенерирует начальное значение еще раз.

Со ссылочной страницы википедии :

Продолжительность периода

Период общего LCG составляет не более м , а для некоторых выборов гораздо меньше. При условии, что с отлично от нуля, LCG будет иметь полный период для всех начальных значений, если и только если :

Хотя LCG способны генерировать приличные псевдослучайные числа , это чрезвычайно чувствительно к выбору параметров с , м и a .

Исторически неудачный выбор приводил к неэффективному внедрению LCG. Особенно показательным примером этого является RANDU, который широко использовался в начале 1970-х годов и привел ко многим результатам, которые в настоящее время подвергаются сомнению из-за использования этого плохого LCG.

Почему вы хотите использовать генератор полного цикла

Если вы не ограничиваете себя PRNG с полным циклом LCG, тогда вы берете на себя огромный риск .

Если вы не знаете, что данный LCG является полным циклом, то вы можете получить генератор с произвольным числом взаимно отличающихся друг от друга последовательностей, некоторые из которых могут быть смущающе маленькими и иметь ужасающую случайность, возможно, даже хуже, чем печально известный генератор RANDU ,

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

дальнейшее чтение

Чтобы получить отличную информацию о генераторах псевдослучайных чисел, я настоятельно рекомендую вам прочитать главу « Числовые рецепты», посвященную случайным числам.

Марк Бут
источник
Это правда, но я не ограничиваю себя сжиженными газогенераторами с полным периодом ... Мне любопытно, как плохо выбираются a, c и m, так что случайные потоки, которые не достигают полного периода. Я хотел бы знать заранее, учитывая некоторые a, c и m, какой период неизбежно будет. Я знаю, что он ограничен сверху m, но мне было интересно, можем ли мы добиться большего успеха и получить точный период.
Павел
Я не думаю, что это расходится с технической точки зрения: вопрос заключался в том, «как определить период LCG с произвольными параметрами», в то время как этот ответ говорит: «не используйте произвольные LCG, всегда используйте полные периодические LCG, и, если вы это сделаете , ответом на ваш вопрос будет максимально возможный период по определению ». Аргумент в пользу использования полноэкранных LCF, изложенный в этом ответе, совершенно убедителен, но проблема заключается не в том, что задал вопрос.
xdavidliu
Извините @xdavidliu, но я не вижу, как ваш новый комментарий помогает мне улучшить мой ответ. Вы обратили мое внимание на то, что я на самом деле не ответил на вопрос, я отредактировал свой ответ, чтобы исправить это, а затем дал вам знать таким образом, который, как я думал, может заставить вас улыбнуться (если вы поклонник Футурамы). Я не вижу, чтобы что-то еще нужно было сказать.
Марк Бут
Обратите внимание, что при обмене стека комментарии не предназначены для расширенных обсуждений, для этого используйте Computational Science Chat . Комментарии предназначены для улучшения вопросов и ответов и отвлекают, поэтому мы стараемся свести их к минимуму. Комментарии должны считаться эфемерными, любой комментарий, который больше не помогает улучшить вопрос или ответ, может быть удален в любое время, чтобы привести в порядок пост.
Марк Бут