Я пишу приложение в среде, которая показываетЗапись 36 битного генератора случайных чисел с
- 36-битного комплемента целых
- арифметику ограничивается
+
,-
,*
,/
и остатком - нет битовых операций, таких как
AND
илиOR
. Но из-за своего дополненияXOR
эквивалентно вычитанию, аNOT
- отрицанию. - числовое переполнение является фатальным, поэтому не может использоваться для бесшумного усечения
- Да, есть условные обозначения:
IF/THEN/ELSEIF/ELSE/IF
.
В идеале, я хотел бы получить 35 или 36 бит случайных целых чисел, но 25 бит тоже хватит.
Мои наивные реализации linear congruential generator работают при переполнении, если они основаны на достаточно больших количествах и производят лишь небольшое количество бит при использовании меньших чисел.
Поэтому я ищу либо набор чисел a, c, m, который даст максимальное количество бит в ограничениях, или разумную адаптацию LCG для объединения двух или более чисел.
В качестве отправной точки, вот что я использую до сих пор:
*DEFINE NextRandom . min,max resultVar
* . This is a very shitty RNG. The numbers were never checked
* . for suitability for a long-period linear congruential generator.
* . But it yields numbers that look vaguely random.
*CLEAR rq
*CLEAR rr
*SET RandZ = RandZ * 169687 + 347011 . RandZ is a global var.
*DIVIDE RandZ BY 131072 GIVING rq, RandZ . Division yields a remainder
*DIVIDE RandZ BY 4 GIVING rq
*SET r0 = +[#,[#],1,1] . r0 = argument 'min'
*SET r9 = +[#,[#],1,2] . r9 = 'max'
*SET rd = r9 - r0 + 1
*DIVIDE rq BY rd GIVING rq, rr
*SET [#,[#],2,1] TO r0 + rr . return in 'resultVar'
*ENDDEFINE
В случае, если кто заботится, язык сценариев SSG (Символическое Generator Stream) в операционной системе 2200 мэйнфреймов UNISYS под названием EXEC 8.
О критичности: приложение, в котором работает этот RNG, генерирует тестовые данные. Это не шифрование государственных секретов или ядерных ракетных кодов. Поэтому мы говорим о том, что «приятно иметь» и «лучше всего», а не «критически важно». Я был бы доволен улучшением, но не искал окончательного решения.
У вас есть условные обозначения? – Pubby
Вы можете улучшить то, что у вас есть, запустив то, что у вас есть, чтобы генерировать начальное значение. –
@Pubby: Да, есть IF/THEN/ELSE/ENDIF. Я собираюсь обновить свой вопрос, чтобы отразить это, спасибо! –