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