Я хочу сгенерировать псевдослучайные числа / перестановки, которые «занимают» полный период или полный цикл в пределах диапазона. Обычно для генерации таких последовательностей можно использовать «линейный конгруэнтный генератор» (LCG), используя такую формулу, как:
X = (a*Xs+c) Mod R
Где Xs - начальное значение, X - результат, a и c - относительно простые константы, а R - максимум (диапазон).
(Под полным периодом / полным циклом я имею в виду, что константы могут быть выбраны так, чтобы любой X встречался только один раз в некоторой случайной / переставленной последовательности и находился в диапазоне от 0 до R-1 или от 1 до R).
LCG почти полностью удовлетворяет мои потребности. Проблема, с которой я сталкиваюсь с LCG, заключается в неслучайности нечетного / четного результата, то есть: для начального числа Xn результат X будет чередоваться нечетным / четным.
Вопросы:
Кто-нибудь знает, как создать нечто подобное, в котором не будет чередоваться четное и нечетное?
Я считаю, что можно построить «составной LCG», но у меня нет подробностей. Может кто-нибудь привести пример этого CLCG?
Существуют ли альтернативные формулы, которые могут соответствовать приведенным выше деталям и ограничениям ниже?
Ограничения:
- Я хочу что-то, основанное на простой формуле на основе семян. то есть: чтобы получить следующее число, я предоставляю начальное число и получаю следующее «случайное число» в переставленной последовательности. В частности, я не могу использовать предварительно рассчитанные массивы. (См. Следующие пункты)
- Последовательность обязательно должна быть «полный период / полный цикл».
- Диапазон R может составлять несколько миллионов или даже 32 бит / 4 миллиарда.
Расчет не должен страдать от переполнения и быть эффективным / быстрым, т. Е. Без больших экспонент или десятков умножений / делений.
Последовательность не обязательно должна быть ужасно случайной или безопасной - мне не нужна криптографическая случайность (но я могу использовать ее, если возможно), просто «хорошая» случайность или кажущаяся случайность, без нечетных / четных последовательностей.
Любые мысли оценены - заранее спасибо.
ОБНОВЛЕНИЕ: в идеале переменная Range не может быть точной степенью двойки, но должна работать в любом случае.