Random 为什么Fortran随机种子输入是一个数组?

Random 为什么Fortran随机种子输入是一个数组?,random,fortran,random-seed,Random,Fortran,Random Seed,我使用下面的代码初始化我的种子(我不知道我在哪里找到它,但每个人,绝对每个人似乎都有这个!为什么?为什么37?) 现在为什么参数PUT是一个数组(大小为.ge.n)?我只能找到消息来源,说这是应该的,而不是为什么 第12页,共页 我很怀疑“绝对每个人”都有你37岁的表情 为什么是37岁?人们可以假设这是因为一些伪随机生成器可能会从平凡的初始种子(如[0,0,0…]+当前_时间)中给出质量可疑的序列,因此他们选择一些足够大(但不会太大以避免溢出)的素数,并使用该素数的倍数来获得一些更非平凡的种

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

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

  • 第12页,共页
  • 我很怀疑“绝对每个人”都有你37岁的表情

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

    当然,你必须问问那些想出这种特殊表达方式的人

    其他值(如31或41)是否也适用?我非常相信。您可以尝试并查看它们,但是您可以从使用不同生成器的不同编译器获得不同的结果。你也可以使用更大的素数的其他组合,而不仅仅是其中一个的倍数,还有很多可能性

    如果希望每次获得不同的种子值,还可以使用GCC 4.8手册中所示的方法:

    这是非常流行的,请注意在他们的表达式中没有37,他们使用更先进的方法来获得具有足够熵的种子

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


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

    这是一个数组,因为Fortran标准说它是一个数组(大小可能为1)。除此之外,你是否在问为什么一个PRNG可以从一个以上数字描述的状态中获益?是的。特别是描述的PRNG。例如,“英特尔Fortran随机_”种子大小为2。我知道一些实现具有更大的种子阵列。
    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