【发布时间】:2016-05-18 16:04:30
【问题描述】:
我对 Fortran 比较陌生,正在尝试理解 RANDOM_NUMBER 和 RANDOM_SEED 子例程。尽管我在程序顶部的DO LOOP 之外播种了生成器,但以下代码不断产生相同的随机数序列。
1 PROGRAM TEST
2
3 IMPLICIT NONE
4
5 INTEGER :: I, OUTPUT
6 REAL :: R
7
8 CALL RANDOM_SEED()
9
10 DO I=1, 10
11 CALL RANDOM_NUMBER(R)
12 OUTPUT = I*R
13 PRINT *,'Random number ', I, ' = ', OUTPUT
14 END DO
15
16 END PROGRAM TEST
这是我运行代码时的输出
Random number 1 = 0
Random number 2 = 1
Random number 3 = 2
Random number 4 = 2
Random number 5 = 1
Random number 6 = 2
Random number 7 = 0
Random number 8 = 0
Random number 9 = 3
Random number 10 = 3
我每次运行代码时都会得到这个确切的序列。我什至尝试重新编译以查看生成器是否会在编译时重新设置种子。
【问题讨论】:
-
快速谷歌搜索返回:如果调用 RANDOM_SEED 时不带参数,它会被初始化为默认状态。如果您没有在参数中提供任何内容,您似乎每次都会得到相同的随机数序列。
-
是的,我也看过那篇文章,但后来我进一步阅读(例如在英特尔论坛上),如果你在没有参数的情况下调用 random_seed,计算机将获取日期/时间以用作默认为种子。我对此的解释是,如果在没有参数的情况下调用 RANDOM_SEED,计算机将自动播种
-
如前所述,行为取决于您的编译器。请添加详细信息。无论您使用的哪个编译器都选择使用可重复序列,这是“显而易见的”,但知道哪个编译器这样做将使其他读者受益。
-
在another question(cmets 和答案)中可以看到依赖于编译器的性质。
-
你的意思是让这些行号表明你正在使用固定格式的源代码,还是仅仅作为外部评论?如果它打算作为固定形式,那么您的缩进就会被破坏。如果不是,则它不是可复制运行的。 [这两个问题都不是非常重要的问题,而是未来需要考虑的问题。]