Den*_*nis 5 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 + 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
Run Code Online (Sandbox Code Playgroud)
并有这个错误:
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)
Run Code Online (Sandbox Code Playgroud)
我根本不使用Fortran(我是C++的人),所以如果有人可以提供帮助并使其正常工作,我将非常感激.
ps在类似的问题上我发现了几个论坛帖子,目前的uncomment解决方案类似于这个GCC bug报告中提到的解决方案.
在这个堆栈溢出帖子中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
Run Code Online (Sandbox Code Playgroud)
为了放大@Yossarian的评论,这个
call random_seed(size = n)
Run Code Online (Sandbox Code Playgroud)
返回,n如果要初始化RNG,则必须使用的1级整数数组的大小.我建议iseed通过将其声明更改为:
integer, dimension(:), allocatable :: iseed
Run Code Online (Sandbox Code Playgroud)
然后,在获取值之后n,分配它:
allocate(iseed(n))
Run Code Online (Sandbox Code Playgroud)
用你喜欢的值填充它,然后put它.
您可以在一个语句中分配和填充它,如下所示:
allocate(iseed(n), source = clock + 37 * [(i, i = 0,n-1)])
Run Code Online (Sandbox Code Playgroud)
我写的可能是因为这取决于编译器的最新版本.
OP评论后编辑
不,你还不太了解我的建议.
n通过执行获取值
call random_seed(size = n)
Run Code Online (Sandbox Code Playgroud)
不要初始化n为12.
然后分配数组并在一个语句(使用源分配)或allocate语句后跟赋值中填充它.
在
allocate(iseed(n))
call random_seed(size = n)
Run Code Online (Sandbox Code Playgroud)
操作顺序不正确.这设置iseed为有12个元素(这是n执行第一个语句时的值),然后设置n为RNG所需的数组大小.只要这是12你就不会看到任何问题,但只要你将代码移植到另一个编译器,甚至可能是同一编译器的另一个版本,你就有可能遇到需要不同大小的整数数组的RNG .没有必要将值硬编码到代码中,所以不要.
| 归档时间: |
|
| 查看次数: |
3208 次 |
| 最近记录: |