2017-05-31 41 views
0

大量の乱数を生成する必要があります(ゼロから1まで、均等に分散します)。PGI Fortranを使用して多数の乱数を生成する際のセグメンテーションフォルト

私が最初にDoループを持っていたなどの場で乱数を生成した数字を生成するときに、私は「コールRANDOM_NUMBERコメントアウト場合

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

しかし、私は((セグメンテーションフォールトを得ていました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がある場合は、**フルコード**を表示してください。 'プログラム'と '終了プログラム'を含むすべて。 [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に設定しようとしましたが、4000回で1回の繰り返し、次に6回の繰り返しで5回繰り返しました。だからそれはまだコアを投げ捨てているようだ。どのようにそれを防ぐためにどのようなアイデア? (それはサブルーチンの中で呼び出され、ホスト上で実行されます) –

+0

あなたは別の問題があると思います。私はちょうど 'seed(34)'で走り、 'Call RANDOM_NUMBER(RndNum)'を呼び出して、単一の乱数を100,000回繰り返しました。セグフォルトはありません。あなたのバージョンの最小シードサイズを確認しましたか? – Jack

関連する問題