我用Fortran编写了一个使用RANDOM_NUMBER()并使用gfortran编译的程序,但是我注意到生成的随机数在不同版本之间是不一致的。如果不使用RANDOM_SEED()作为随机数生成器的种子,则gfortran4.4.7( Centos 6中的默认值)和gfortran4.8.5( Centos 7中的默认值)都会产生相同的随机数序列。这让我感到惊讶,因为gfortran 4.4.7中的默认种子长8个整数,而gfortran 4.8.5中的缺省种子长12个整数,数字完全不同,但随机数序列仍然是相同的。另一方面,gfortran7.3.1(包含在Centos 7中的devtoolset7包中)在每次运行中都会产生不同的随机数序列,除非用RANDOM_SEED()初始化它。但是,此版本中的种子由33个整数组成,因此旧版本的种子将无法工作。
为了重现性,我需要在每次运行中复制完全相同的随机数序列,而不考虑gfortran版本。我想知道是否有一种方法在不同的gfortran版本之间转换默认的种子,或者是否有其他方法来获得与任何gfortran版本相同的随机数序列。
发布于 2022-09-27 19:17:40
不,对于GFortran 7,PRNG算法被改变为一种完全不同的算法。对于GFortran <7和>= 7,基本上没有办法获得相同的随机数流。
如果您需要不同GFortran版本之间的精确再现性,则需要使用另一个PRNG实现。
发布于 2022-09-27 19:36:09
詹妮布是对的。
如果您需要编译器版本之间的一致性,甚至编译器(ifort
,pgfortran
)之间的一致性,那么您应该使用内置工具以外的其他工具。我个人知道SPRNG (http://www.sprng.org/),大概还有许多其他类似的工具。
https://stackoverflow.com/questions/73871987
复制相似问题