乱数ジェネレーターを作成しようとしています (乱数は後で [AZ] 文字に変換されます)。ランダム ジェネレーターの主要部分は動作していますが、常に同じランダム結果を受け取り0.6734141422
ます。
私が直面しているもう 1 つの問題は、プログラムのコンパイルが速すぎるということです。現在の日付をミリ秒単位で使用しているため、プログラムを高速にコンパイルすると、同じシードがRANDOM
関数に与えられます。に適用する前に、各シードをカウンターで割るカウンターを単純に追加することを考えていましたRANDOM
。これで十分でしょうか、それとももっと洗練されたソリューションがありますか?
異なるシード値が適用されているにもかかわらず、常に同じランダムな結果を受け取る理由を誰かに説明してもらえますか? プログラムを実行するたびに、この結果が得られます。
私が読んだ限り、OpenCobolに準拠しているPerCobolコンパイラを使用しています。
総括する:
- 均等なシードを克服するにはどうすればよいですか?
異なるシードで同じランダム結果を受け取るのはなぜですか?
000100 IDENTIFICATION DIVISION. 000200 PROGRAM-ID. RandomTest. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 RANDOMRESULT PIC S9V9(10). 01 WS-CURRENT-DATE-DATA. 05 WS-CURRENT-DATE. 10 WS-CURRENT-YEAR PIC 9(04). 10 WS-CURRENT-MONTH PIC 9(02). 10 WS-CURRENT-DAY PIC 9(02). 05 WS-CURRENT-TIME. 10 WS-CURRENT-HOURS PIC 9(02). 10 WS-CURRENT-MINUTE PIC 9(02). 10 WS-CURRENT-SECOND PIC 9(02). 10 WS-CURRENT-MILLISECONDS COMP-2. 05 WS-DIFF-FROM-GMT PIC S9(04). PROCEDURE DIVISION. PRGRM. PERFORM 4 TIMES MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-DATE-DATA COMPUTE RANDOMRESULT = FUNCTION RANDOM (WS-CURRENT-MILLISECONDS) DISPLAY "Seed value: " WS-CURRENT-MILLISECONDS UPON SYSOUT DISPLAY "Random result: " RANDOMRESULT UPON SYSOUT END-PERFORM STOP RUN.
出力例:
Seed value: 8.222829361429599E-67
Random result: 0.6734141422
Seed value: 8.964670591567083E-67
Random result: 0.6734141422
Seed value: 9.335591206635825E-67
Random result: 0.6734141422
Seed value: 9.335591206635825E-67
Random result: 0.6734141422
私の元の問題 (英数字で構成されるランダムなパスワードの作成) にアプローチするための提案があれば、それも喜んで聞きます。
編集:シードを省略すると、両方の問題が一度に修正されます。この結論の背後にある詳細については、以下のコメントを参照してください。別のシードでも同じ値が得られる理由について誰かが説明してくれたら、それを聞いてうれしいです!