2014-01-21 135 views
5

我試圖編譯使用Gfortran 4.7從MAC端口(OS-X)以下簡單的代碼:gfortran和隨機數

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因爲我不併行運行反正

UPDATE:

以下工作:

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 
+0

您鏈接到的GCC錯誤報告有解決方案:您需要設置'n = 12'和'integer,dimension(12):: iseed'。 'random_seed'的'put'參數需要一個12個整數的數組。 – Yossarian

回答

8

爲了擴增有所on @ Yossarian的評論,這

call random_seed(size = n) 

返回n,如果要初始化RNG,則必須使用rank 1整型數組的大小。我建議通過改變它的聲明作出iseed分配:

integer, dimension(:), allocatable :: iseed 

然後,得到一個值n後,它分配:

allocate(iseed(n)) 

用你喜歡的值填充它,然後它put

您可能能夠分配和在一個語句填充它是這樣的:

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

我寫可能因爲這取決於如何保持最新的編譯器。

編輯,在OP評論

不,你還沒完全理解我的建議。

通過執行

call random_seed(size = n) 

不初始化n至12

然後分配在陣列並填充它,無論是在一個語句獲取n的值(使用源分配)或allocate語句後跟一個作業。

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

操作的順序不正確。這將iseed設置爲有12個元素(執行第一條語句時的值爲n),然後將n設置爲RNG所需的數組大小。只要是12就不會看到任何問題,但只要將代碼移植到另一個編譯器,甚至可能是相同編譯器的另一個版本,就會冒險運行到需要不同大小的整數數組的RNG中。沒有必要將值連接到代碼中,所以不要。

+0

感謝您的回覆。我把更新代碼放在裏面,這是你的意思嗎?感謝您的更新,我編譯好了 – Denis

+0

。瞭解。 – Denis