我試圖創建一個隨機數字發生器(從中隨機數字稍後將被轉換成[A-Z]字符)。我有隨機發生器的主要部分工作,但我不斷收到相同的隨機結果0.6734141422
。隨機函數總是返回相同的結果,儘管不同的種子
我正面臨着另一個問題:我的程序編譯速度過快一半。由於我以毫秒爲單位使用當前日期,所以讓我的程序快速編譯將意味着RANDOM
函數會使用相同的種子。我一直在考慮簡單地添加一個計數器,它會將每個種子的計數器分配到RANDOM
之前。這是否足夠,還是有更多優雅的解決方案?
有人可以向我解釋爲什麼我總是收到相同的隨機結果,即使應用不同的種子值?每次執行程序時我都會得到這個結果。
我正在使用PerCobol編譯器,就像我讀過的那樣,它與OpenCobol一致。
綜上所述:
- 我應該如何克服等於種子隊?
爲什麼我用不同的種子接收相同的隨機結果?
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
如果你對我的接近原來的問題(包括創建的字母數字字符的隨機密碼)的建議,我會很高興聽到它好。
編輯: 通過省略種子,這兩個問題都立即修復。更多背後的結論可以在下面的評論中找到。如果有人解釋爲什麼不同的種子仍然具有相同的價值,我很樂意聽到它!
謝謝,清除它! – 2013-03-04 21:52:46