gfortran和随机数字

时间:2014-01-21 10:36:54

标签: random fortran gfortran

我正在尝试使用Gfortran 4.7从mac-ports(OS-X)编译以下简单代码:

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.S。在一个类似的问题上,我发现了几个论坛帖子,目前的取消注释解决方案类似于this GCC bug report中提到的解决方案。

提到abs的那个in this stack overflow post(没有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

1 个答案:

答案 0 :(得分:8)

在@Yossarian的评论中略微放大,

call random_seed(size = n)

n中返回如果要初始化RNG,则必须使用的1级整数数组的大小。我建议通过将其声明更改为:{/ p>来使iseed可分配

integer, dimension(:), allocatable :: iseed

然后,在获得n的值后,分配它:

allocate(iseed(n))

使用您喜欢的值填充它,然后put填充它。

您可以在一个语句中分配和填充它,如下所示:

allocate(iseed(n), source = clock + 37 * [(i, i = 0,n-1)])

我写可能因为这取决于编译器的最新版本。

编辑,OP评论后

不,你还不太了解我的建议。

通过执行

获取n的值
call random_seed(size = n)

不要将n初始化为12。

然后分配数组并在一个语句(使用源分配)或allocate语句后跟一个赋值中填充它。

allocate(iseed(n))
call random_seed(size = n)

操作顺序不正确。这将iseed设置为具有12个元素(执行第一个语句时为n的值),然后将n设置为RNG所需的数组大小。只要这是12你就不会看到任何问题,但只要你将代码移植到另一个编译器,甚至可能是同一编译器的另一个版本,你就有可能遇到需要不同大小的整数数组的RNG 。没有必要将值硬编码到代码中,所以不要。