我正在尝试创建一个随机数生成器(一些随机数稍后将被转换为 [AZ] 字符)。我已经让随机生成器的主要部分正常工作,但我不断收到相同的随机结果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
如果您对解决我最初的问题有建议(创建一个由字母数字字符组成的随机密码),我也很高兴听到它。
编辑:通过省略种子,两个问题都立即得到解决。这个结论背后的更多信息可以在下面的评论中找到。如果有人解释为什么不同的种子仍然会产生相同的值,我会很高兴听到它!