Я хочу генерировать псевдослучайные числа / перестановки, которые «занимают» полный период или полный цикл в пределах диапазона.Обычно «Линейный конгруэнтный генератор» (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 не может быть точной степенью двойки, но должна работать в любом случае.