为什么 Fortran RANDOM_SEED 输入的是一个数组?

Why is the Fortran RANDOM_SEED input an array?

我使用下面的代码来初始化我的种子(我不知道我在哪里找到的,但是每个人,绝对每个人似乎都有这个!为什么?为什么是 37?)

SUBROUTINE init_random_seed()
IMPLICIT NONE
INTEGER :: i, n, clock
INTEGER, DIMENSION(:), ALLOCATABLE :: seed

CALL RANDOM_SEED(size = n)
ALLOCATE(seed(n))

CALL SYSTEM_CLOCK(COUNT=clock)

seed = clock + 37 * (/ (i - 1, i = 1, n) /)
CALL RANDOM_SEED(PUT = seed)

DEALLOCATE(seed)
END SUBROUTINE

现在为什么 PUT 的参数是一个数组(大小为.ge.n)?我只能找到说应该如此的消息来源,而不是为什么。

  1. 第 12 页,共 http://www.mhhe.com/engcs/general/chapman/intro/INTRINSI.PDF
  2. https://gcc.gnu.org/onlinedocs/gfortran/RANDOM_005fSEED.html
  3. https://software.intel.com/en-us/node/581112

我很怀疑"absolutely everyone"有你的表情37.

为什么是 37?人们可以假设这是因为某些伪随机生成器可能会从微不足道的初始种子(如 [0,0,0...] + current_time)中给出质量可疑的序列,因此他们选择了一些足够大(但不是太大大以避免溢出)质数并使用该质数的倍数来获得更多不平凡的种子。人们仍然可以争论这个种子中是否会有足够的熵,我会避免这种表达式用于高级用法(密码学甚至一些蒙特卡洛模拟)。

为了确保你必须问问那些想出这个特殊表达方式的人。

像 31 或 41 这样的其他值是否也有类似的作用?我非常相信。你可以试试看,但你可以期待使用不同生成器的不同编译器会产生不同的结果。您还可以使用更大素数的其他组合,而不仅仅是其中一个的倍数,有很多可能性...

如果想每次得到不同的种子值,也可以使用GCC 4.8手册中的方法:https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gfortran/RANDOM_005fSEED.html#RANDOM_005fSEED

很流行,注意他们的表达式中没有 37,他们使用更高级的方法来获得具有足够熵的种子。

最后,为什么种子是数组?因为标准是这么说的。

为什么标准是这样设计的? (可能)因为数组中的熵比单个数字中的更多。您有更多可能的组合。