在 Fortran 中为 Metropolis 方法生成随机数

计算科学 正则 统计数据 随机数生成
2021-12-25 01:14:21

我很难从我的 Metropolis 代码中获得任何可靠/一致的结果。我已经把它拆开,现在正在检查我的随机数生成器中的随机性。

我决定在从 -1 到 1 的范围内运行多次迭代,它应该给我一个平均值 0。我对缺乏精度感到非常惊讶。我的代码确实给出了大约为零的结果,但是从 -200 到 200,在整个范围内几乎均匀分布。

我正试图找到一种方法来使这更接近。我已经尝试了更多的运行(知道 10,000 次并没有那么多),但即使运行多达 10 亿次,平均值的范围也可能相同,甚至更多。

关于如何解决这种随机性的任何建议?

我一直在使用:

    program test_rand
    real*8 x, y, z, EAx, EAy, EAz, Tx, Ty, Tz
    integer j, i

    CALL init_random_seed

    Do i = 1, 10000
        EAx = 0.D0
        EAy = 0.D0
        EAz = 0.D0
        Tx = 0.D0
        Ty = 0.D0
        Tz = 0.D0
        Do j=1,10000
            CALL RANDOM_NUMBER(x)
            CALL RANDOM_NUMBER(y)
            CALL RANDOM_NUMBER(z)
            EAx = 2.0D0 * x - 1.0D0
            EAy = 2.0D0 * y - 1.0D0
            EAz = 2.0D0 * z - 1.0D0
            Tx = EAx + Tx
            Ty = EAy + Ty
            Tz = EAz + Tz
        end do
        write(50,*) i, Tx, Ty, Tz
    end do
    end program test_rand

    !   initialize a random seed from the system clock at every run (fortran 95 code)
    subroutine init_random_seed()
    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
0个回答
没有发现任何回复~