gpt4 book ai didi

random - 在 Fortran 模块中生成随机数

转载 作者:行者123 更新时间:2023-12-02 08:25:28 25 4
gpt4 key购买 nike

现在我面临的问题是,在模块中,使用种子生成要在函数循环中使用的随机数,但每次调用该函数时,都会生成相同的随机数已生成(因为种子显然是相同的),但假设它必须继续该系列,或者至少在调用之间必须不同。一种解决方案可能是主程序提供一个要在模块中使用的新种子,但我认为可能还有另一种优雅的解决方案。根据很多人的建议,我正在使用 Mersenne Twister 生成器。

已添加

我的模块中的函数(它是一个函数包)本质上使用种子生成的随机数进行这样的 Metropolis 测试,出于某种原因,如果我输入,编译会提示

    module mymod
uses mtmod
call sgrnd(4357)!<-- this line causes compilation error
contains
myfunc(args)
implicit none
// declarations etc
!call sgrnd(4357) <-- if I put this call here compilator says ok,
!but re-start random number series each time this function is called :(
....
!the following part is inside a loop
if (prob < grnd()) then
!grnd() is random number generated
return
else continue testing to the end of the loop cycle
end myfunc

但是,如果我将该函数放在主程序的 contains 中(也使用 mtmod),并在 contains 部分和对 myfunc 的调用之前调用 sgrnd(4357),那么现在一切都可以很好地编译和运行。为了清楚起见,我不想把那么长的函数放在主程序中,它有 70 行代码,但似乎我无法逃脱。请注意,种子被调用一次。模拟现在具有物理意义,但付出了代价。

最佳答案

我总是使用这个子例程(我正在运行蒙特卡洛模拟),在主程序的开头调用它,它应该完成这项工作:

(来源:gfortran 4.6.1)

c   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

关于random - 在 Fortran 模块中生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18754438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com