Random gfortran与随机数
我试图使用mac ports OS-X上的Gfortran 4.7编译以下简单代码:Random gfortran与随机数,random,fortran,gfortran,Random,Fortran,Gfortran,我试图使用mac ports OS-X上的Gfortran 4.7编译以下简单代码: program main implicit none integer :: n = 1, clock, i integer, dimension(1) :: iseed ! initialize the random number generator call random_seed(size = n) call system_clock(COUNT=clock) iseed = clock + 3
program main
implicit none
integer :: n = 1, clock, i
integer, dimension(1) :: iseed
! initialize the random number generator
call random_seed(size = n)
call system_clock(COUNT=clock)
iseed = clock + 37 * (/ (i - 1, i = 1, n) /)
! iseed = clock
! iseed = abs( mod((clock*181)*((1-83)*359), 104729) )
call random_seed(PUT = iseed)
end program main
并有以下错误:
gfortran-mp-4.7 tmp.f90
tmp.f90:17.23:
call random_seed(PUT = iseed)
1
Error: Size of 'put' argument of 'random_seed' intrinsic at (1) too small (1/12)
我根本不使用FORTRAN,我是一个C++的人,所以如果有人能帮助和让它工作,我会非常感激。
p、 在一个类似的问题上,我发现了几个论坛帖子,当前的取消注释解决方案与中提到的类似
有abs的那个被提到了,因为我没有并行运行,所以它没有PID
更新:
以下工作:
program main
implicit none
integer :: n = 12, clock, i
integer, dimension(:), allocatable :: iseed
! initialize the random number generator
allocate(iseed(n))
call random_seed(size = n)
call system_clock(COUNT=clock)
iseed = clock + 37 * [(i, i = 0,n-1)]
call random_seed(PUT = iseed)
end program main
为了对@Yossarian的评论稍作补充,以下是
call random_seed(size = n)
以n为单位返回要初始化RNG时必须使用的秩1整数数组的大小。我建议将ISED的声明更改为:
integer, dimension(:), allocatable :: iseed
然后,在获得n的值后,分配它:
allocate(iseed(n))
用您喜欢的值填充它,然后将其放入
您可以在一条语句中分配和填充它,如下所示:
allocate(iseed(n), source = clock + 37 * [(i, i = 0,n-1)])
我可能会这样写,因为这取决于编译器的最新版本
编辑,在评论之后
不,你还没有完全理解我的建议
通过执行
call random_seed(size = n)
不要将n初始化为12
然后分配数组并填充它,可以在一条使用源分配的语句中进行,也可以在分配语句后面进行
在
操作顺序不正确。这将设置为有12个元素,这是执行第一条语句时n的值,然后将n设置为RNG所需的数组大小。只要这是12,您就不会看到任何问题,但是一旦您将代码移植到另一个编译器,甚至可能是同一编译器的另一个版本,您就有可能遇到需要不同大小的整数数组的RNG。不需要将值硬连接到代码中,所以不要这样做。您链接到的GCC错误报告有一个解决方案:您需要设置n=12和整数,dimension12::ised。random_seed的put参数需要12个整数的数组。感谢您的回复。我放了更新代码,这是你的意思吗?我确实很好
allocate(iseed(n))
call random_seed(size = n)