2017-05-31 58 views
0

我需要生成大量的随机数(从零到1,均匀分布)。使用PGI Fortran生成许多随机数时出现分段错误

我最初有一个Do循环,并在飞行中产生的随机数为这样:

Real :: RandomN 
Integer :: N 
DO N = 1, 10000 
    Call RANDOM_NUMBER(RandomN) 
    ... Some Code ... 
ENDDO 

然而,生成数字时(如果我评论了“呼叫RANDOM_NUMBER(我得到一个分段错误RandomN)“线,它工作正常)。

然后在PGI论坛上阅读帖子(http://www.pgroup.com/userforum/viewtopic.php?t=713&highlight=randomseed)。我决定首先生成所有数字并将它们放入数组中。

Real :: RndNum(1:10000,1:5) 
Integer :: time(8), seed(2) 
Call DATE_AND_TIME(values=time)  ! Get the current time 
seed(1) = time(4) * (360000*time(5) + 6000*time(6) + 100*time(7) + time(8)) 
Call RANDOM_SEED(PUT=seed) 
Call RANDOM_NUMBER(RndNum) 

但是,这给了我一个段错误马上。我已经尝试了减少的版本,没有种子:

Real :: RndNum(1:10000,1:5) 
Call RANDOM_NUMBER(RndNum) 

作品的我的代码几次迭代,然后产生一个分段错误也是如此。我是否使用了某种内存?有没有办法清除它?或防止它被用完?

我也曾尝试:

CALL SYSTEM_CLOCK(count, count_rate, count_max) 
CALL srand(count) 

DO N=1, CAPN 
    RndNum(N,1) = rand() 
    RndNum(N,2) = rand() 
    RndNum(N,3) = rand() 
    RndNum(N,4) = rand() 
    RndNum(N,5) = rand() 
ENDDO 

但是,这也给了段错误。

+1

如果它给你segfault,显示**完整的代码**。包括'program'和'end program'的所有​​内容。见[mcve]。重新编辑:当你尝试时发生了什么? –

+0

完整的代码是几行1000行,涉及多个文件。我已经隔离了这个问题,并试图解释导致问题的那一点。 –

回答

2

您的种子数组太小。获取的最小尺寸是这样的:

program testpgi 
    Real :: RndNum(1:10000,1:5) 
    Integer :: time(8), seed(2) 
    Integer :: min_seed_size 
    Call DATE_AND_TIME(values=time)  ! Get the current time 
    seed(1) = time(4) * (360000*time(5) + 6000*time(6) + 100*time(7) + time(8)) 

    Call RANDOM_SEED(SIZE=min_seed_size) 
    write(*,*) min_seed_size 
end program testpgi 

我只是跑它的PGI编译器,并得到了34。如果我做Integer :: seed(33),它会转储核心。如果我做Integer :: seed(34),它不会。

+0

太好了,谢谢。我会给它一个 –

+0

将它设置为34或更多的种子,允许它运行一个迭代,之后它再次segfaults。我试着将它设置为400,并且它运行了5次迭代,4000次迭代只有1次,然后是6次迭代。所以它似乎仍然是倾销核心。任何想法如何预防它? (它在一个子程序中调用并在主机上运行) –

+0

然后我认为你有另一个问题。我刚刚用'seed(34)'跑过,做了RANDOM_NUMBER(RndNum)调用,并且循环了一次10万次的随机数。没有seg故障。你有没有检查你的版本的最小种子大小? – Jack