2017-05-31 61 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