我很难从我的 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