为什么我的随机数总是一样的



我使用的是Fortran的random_number子程序,但在不同的程序运行中,生成的数字不会改变。我应该在我的代码中包含什么,以便每次我编译和运行程序时,数字都会发生变化?

随机数生成器生成伪随机数。为了每次运行得到不同的数字,您需要在程序开始时初始化随机种子。这会在伪随机流中选择一个不同的起始位置。

random_number的调用产生的伪随机数序列取决于处理器使用的算法和种子的值。

种子的初始值取决于处理器。对于一些处理器,这个种子值在每次程序运行时都是相同的,而对于另一些处理器则是不同的。第一种情况给出一个可重复的伪随机序列,第二种情况给出一个不可重复的序列。

gfortran(版本7之前)属于第一类。如果您希望获得不可重复的序列,则需要显式更改随机种子。

如另一个答案所述,内在的random_seed可以用来设置种子的值并重新启动伪随机生成器。同样,当调用为call random_seed()时(即没有put=参数)所发生的情况取决于处理器。有些处理器会用可重复的序列重新启动发电机,有些则不会。Gfortran(同样是在版本7之前)属于第一类。

对于call random_seed()生成可重复序列的处理器,需要显式的运行时可变种子来生成不同的序列。在文档中可以找到那些旧版本gfortran的示例。

应该注意,选择种子可能是一件复杂的事情。不仅存在可移植性问题,还需要注意确保发电机不会在低熵区域重新启动。对于多图像程序,用户必须在这些图像之间设置不同的序列。

最后,Fortran 2018引入了标准的内在过程random_init。这将处理跨调用选择可重复性和(coarray)图像的区别性这两种情况。

最新更新