Звучит так, будто вам нужен алгоритм, который гарантированно создаст цикл от 0 до n-1 без повторов. Есть почти наверняка целая куча из них в зависимости от ваших требований; теория групп была бы наиболее полезной областью математики, если вы хотите углубиться в теорию, стоящую за ней.
Если вы хотите быстро и не заботитесь о шаблонах предсказуемости / безопасности / статистики, вероятно, LCG - самый простой подход. Страница википедии, на которую вы ссылаетесь, содержит этот (довольно простой) набор требований:
Период общего LCG не более
м, а для некоторых вариантов гораздо меньше
чем это. LCG будет иметь полный
период, если и только если:
- c и m относительно простые,
- a - 1 делится на все простые множители m
- a - 1 кратно 4, если m кратно 4
В качестве альтернативы, вы можете выбрать период N> = n, где N - наименьшее значение, которое имеет удобные числовые свойства, и просто отбросить любые значения, полученные между n и N-1. Например, самое низкое N = 2 k - 1> = n позволит вам использовать регистры сдвига с линейной обратной связью (LFSR). Или найдите свой любимый криптографический алгоритм (RSA, AES, DES и т. Д.) И, учитывая конкретный ключ, определите пространство N чисел, которые оно переставляет, и для каждого шага применяйте шифрование один раз.
Если n мало, но вы хотите, чтобы безопасность была высокой, это, вероятно, самый хитрый случай, поскольку любая последовательность S, вероятно, будет иметь период N, намного больший, чем n, но также нетривиальна для получения неповторяющейся последовательности чисел более короткий период, чем N. (например, если вы можете взять вывод S mod n и гарантировать неповторяющуюся последовательность чисел, это даст информацию о S, которую может использовать злоумышленник)