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