我使用的是Fortran的random_number
子程序,但在不同的程序运行中,生成的数字不会改变。我应该在我的代码中包含什么,以便每次我编译和运行程序时,数字都会发生变化?
随机数生成器生成伪随机数。为了每次运行得到不同的数字,您需要在程序开始时初始化随机种子。这会在伪随机流中选择一个不同的起始位置。
对random_number
的调用产生的伪随机数序列取决于处理器使用的算法和种子的值。
种子的初始值取决于处理器。对于一些处理器,这个种子值在每次程序运行时都是相同的,而对于另一些处理器则是不同的。第一种情况给出一个可重复的伪随机序列,第二种情况给出一个不可重复的序列。
gfortran(版本7之前)属于第一类。如果您希望获得不可重复的序列,则需要显式更改随机种子。
如另一个答案所述,内在的random_seed
可以用来设置种子的值并重新启动伪随机生成器。同样,当调用为call random_seed()
时(即没有put=
参数)所发生的情况取决于处理器。有些处理器会用可重复的序列重新启动发电机,有些则不会。Gfortran(同样是在版本7之前)属于第一类。
对于call random_seed()
生成可重复序列的处理器,需要显式的运行时可变种子来生成不同的序列。在文档中可以找到那些旧版本gfortran的示例。
应该注意,选择种子可能是一件复杂的事情。不仅存在可移植性问题,还需要注意确保发电机不会在低熵区域重新启动。对于多图像程序,用户必须在这些图像之间设置不同的序列。
最后,Fortran 2018引入了标准的内在过程random_init
。这将处理跨调用选择可重复性和(coarray)图像的区别性这两种情况。