fortran - 正确设置随机种子以实现可重复性

标签 fortran gfortran fortran90 intel-fortran

使用 Fortran 90 子程序 random_seed 设置随机种子的方法非常简单。

call random_seed( put=seed )

但是我找不到有关设置种子的指南的任何信息(当您想要可重复性时这是绝对必要的)。我过去听过的民间传说建议标量种子应该很大。例如。 123456789 是比 123 更好的种子。我在网上能找到的唯一支持是建议 ifort 扩展函数 ran() 使用 "large, odd integer value"

我知道这可能是特定于实现的,并且正在使用 gfortran 4.8.5,但我也对 ifort 和(如果可能)独立于实现的一般指南感兴趣。下面是一些示例代码:
# for compactness, assume seed size of 4, but it will depend on 
# the implementation (e.g. for my version of gfortran 4.8.5 it is 12)

seed1(1:4) = [ 123456789, 987654321, 456789123, 7891234567 ]
seed2(1:4) =   123456789
seed3(1:4) = [         1,         2,         3,          4 ]

我猜 seed1 很好,但如果你手动设置它(就像我一样),因为种子长度可以是 12 或 33 或其他任何值,所以非常冗长。而且我什至不确定这是否正常,因为我根本找不到关于设置这些种子的任何指导方针。 IE。据我所知,这些种子应该是负数,或者 3 位偶数,等等。虽然我猜你希望实现会警告你(?)。
seed2seed3 显然设置起来更方便,而且据我所知,它们都一样好。 @Ross 在他的回答中暗示 seed2 实际上很好:Random number generator (RNG/PRNG) that returns updated value of seed

所以我的问题总结起来就是:如何正确设置种子? seed1seed3 中的任何一个或全部是否可以接受?

最佳答案

设置种子的指南取决于 RANDOM_NUMBER 的 PRNG 算法使用,但一般来说,您提供的“熵”越多越好。

如果您只有一个标量值,您可以使用一些简单的 PRNG 将其扩展为 RANDOM_SEED 所需的完整种子数组。 .见例如函数lcghttps://gcc.gnu.org/onlinedocs/gcc-4.9.1/gfortran/RANDOM_005fSEED.html 处的示例代码中

当前版本的 GFortran 对坏种子有一些保护,并且它应该相对不受“哑”种子的影响(例如 seed(:) 的所有值都相同,或者所有值都很小甚至为零),但是为了可移植到其他编译器如下我上面建议的可能仍然是一个好主意。

关于fortran - 正确设置随机种子以实现可重复性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51893720/

相关文章:

fortran - 计算的 GOTO 无法执行

fortran - 内联关键字 gfortran

fortran - 将 FFTW 计划传递给 Fortran 子例程

pointers - 指针作为伪参数

arrays - Fortran 错误 # 6366 : The shapes of the array expressions do not conform

loops - 如何将循环转换为向量赋值符号

fortran - 函数没有隐式类型

fortran - 在 Gfortran 中使用可选参数时接口(interface)不明确

fortran - gfortran 的续行不起作用

fortran - gfortran 编译错误 : Size of 'put' argument of 'random_seed' intrinsic at (1) too small