使用 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 位偶数,等等。虽然我猜你希望实现会警告你(?)。seed2
和 seed3
显然设置起来更方便,而且据我所知,它们都一样好。 @Ross 在他的回答中暗示 seed2
实际上很好:Random number generator (RNG/PRNG) that returns updated value of seed所以我的问题总结起来就是:如何正确设置种子?
seed1
到 seed3
中的任何一个或全部是否可以接受?
最佳答案
设置种子的指南取决于 RANDOM_NUMBER
的 PRNG 算法使用,但一般来说,您提供的“熵”越多越好。
如果您只有一个标量值,您可以使用一些简单的 PRNG 将其扩展为 RANDOM_SEED
所需的完整种子数组。 .见例如函数lcg
在 https://gcc.gnu.org/onlinedocs/gcc-4.9.1/gfortran/RANDOM_005fSEED.html 处的示例代码中
当前版本的 GFortran 对坏种子有一些保护,并且它应该相对不受“哑”种子的影响(例如 seed(:)
的所有值都相同,或者所有值都很小甚至为零),但是为了可移植到其他编译器如下我上面建议的可能仍然是一个好主意。
关于fortran - 正确设置随机种子以实现可重复性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51893720/