次の機能を備えた環境でアプリケーションを作成しています
- 36 ビットの 1 の補数の整数
+
、-
、*
、/
および剰余に限定された算術AND
またはのようなビット操作はありませんOR
。しかし、1 の補数であるため、減算と否定にXOR
相当します。NOT
- 数値のオーバーフローは致命的であるため、サイレント トランケーションには使用できません
- はい、条件があります:
IF/THEN/ELSEIF/ELSE/IF
.
理想的には、35 ビットまたは 36 ビットのランダムな整数が必要ですが、25 ビットでも十分です。
線形合同法ジェネレーターの単純な実装は、十分に大きな数値に基づいている場合にオーバーフローに陥り、小さい数値を使用すると少数のビットしか生成しません。
したがって、制約内の最大ビット数を生成する数値a、c、mのセット、または 2 つ以上の数値を結合するための 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
スクリプト言語は、EXEC 8 と呼ばれる UNISYS 2200 メインフレーム オペレーティング システムの SSG (Symbolic Stream Generator) です。
重要度: この RNG が動作するアプリは、テスト データを生成します。国家機密や核ミサイルコードを暗号化しているわけではありません。つまり、「ミッション クリティカル」ではなく、「あったらいいな」と「ベスト エフォート」について話しているのです。私は改善に満足していますが、究極の解決策を探しているわけではありません.