正确设置随机种子的重复性

Joh*_*hnE 3 fortran gfortran fortran90 intel-fortran

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

call random_seed( put=seed )
Run Code Online (Sandbox Code Playgroud)

但我找不到任何关于设置种子的指导方针的信息(当你想要重复性时这是绝对必要的).我过去听过的民间传说认为标量种子应该很大.例如,123456789是一个比123更好的种子.我可以在网上找到的唯一支持就是ifort扩展函数建议ran()使用"大,奇整数值"

我理解这可能是特定于实现的,并且正在使用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 ]
Run Code Online (Sandbox Code Playgroud)

我猜这seed1很好,但如果你手动设置它(因为我),因为种子长度可以是12或33或其他什么,这很简单.而且我甚至不确定它没关系,因为我无法找到关于设置这些种子的任何指导方针.也就是说,这些种子应该对我所知道的全部是负数,或者是3位偶数等等,虽然我猜你希望实施会警告你(?).

seed2并且seed3显然更方便设置,而且我所知道的一切都很好.@Ross建议seed2他的回答实际上很好: 随机数生成器(RNG/PRNG)返回种子的更新值

所以我的总结问题是:我怎样才能正确设定种子?是否seed1可以seed3接受任何或全部?

jan*_*neb 5

设置种子的准则取决于使用的PRNG算法RANDOM_NUMBER,但一般来说,您提供的"熵"越多越好.

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

当前版本的GFortran对坏种子有一些保护,它应该相对免于"哑"播种(例如所有seed(:)相同的值,或所有值小或甚至为零),但是对于其他编译器的可移植性,遵循我上面建议的可能仍然是一个好主意.