2016-05-24 3 views
1

私は私がシード初期化するために、次のコードを使用します(私はそれを見つけた私は知らないが、誰もが、絶対に誰もが正確にこれを持っているようだ!なぜ?なぜ37?)Fortran RANDOM_SEED入力が配列であるのはなぜですか?

SUBROUTINE init_random_seed() 
IMPLICIT NONE 
INTEGER :: i, n, clock 
INTEGER, DIMENSION(:), ALLOCATABLE :: seed 

CALL RANDOM_SEED(size = n) 
ALLOCATE(seed(n)) 

CALL SYSTEM_CLOCK(COUNT=clock) 

seed = clock + 37 * (/ (i - 1, i = 1, n) /) 
CALL RANDOM_SEED(PUT = seed) 

DEALLOCATE(seed) 
END SUBROUTINE 

さて、なぜですPUTの引数(サイズ.ge。n)?私はそれがどのようにしなければならないのか、なぜそうでないのかを伝える情報源しか見つけることができません。

  1. http://www.mhhe.com/engcs/general/chapman/intro/INTRINSI.PDF
  2. https://gcc.gnu.org/onlinedocs/gfortran/RANDOM_005fSEED.html
  3. https://software.intel.com/en-us/node/581112
+0

Fortran標準では配列(サイズは1)である可能性があるため、配列です。それ以外に、PRNGが複数の番号で記述された状態を持つことによって利益を得るのはなぜですか? – francescalus

+0

はい。特に、PRNGは[ここ](https://gcc.gnu.org/onlinedocs/gfortran/RANDOM_005fNUMBER.html)で説明されています。 – physkets

答えて

1

のPg.12私は非常に疑問"絶対に誰も"は37

なぜ37を使用して表現していますか?疑似乱数ジェネレータの中には、初期シード([0,0,0 ...] + current_timeのようなもの)から疑わしい品質のシーケンスを与えるものがあるため、十分に大きなものを選んだので(オーバーフローを避けるには大きすぎない) )素数を計算し、その多項式を使ってより単純ではない種を得る。この種子に十分なエントロピーがあるかどうかはまだ議論の余地があります。高度な使い方(暗号やモンテカルロシミュレーション)でこの表現を避けることにします。

この特定の表現を思いついた人に必ず尋ねる必要があります。

31または41などの他の値は同様に動作しますか?私はとてもそう信じています。それらを試してみることはできますが、異なるジェネレータを使用する異なるコンパイラの結果を期待できます。あなたはさらに大きな素数のいくつかの他の組み合わせを使用することができ、それらの倍数だけでなく、多くの可能性があります...

毎回別のシード値を取得する場合は、 GCC 4.8マニュアルに示されています。https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gfortran/RANDOM_005fSEED.html#RANDOM_005fSEED

非常に普及しており、表現に37がないことに気づいています。彼らは十分なエントロピーを持つ種を得るためにより高度な方法を使用しています。

そして最後になぜ種は配列ですか?スタンダードはそう言いますから。

なぜ標準はそのように設計されていますか? (おそらく)単一の数よりも多くのエントロピーが配列内にあるからです。あなたはもっと多くの組み合わせが可能です。

+0

例として、インテルFortranのRANDOM_SEEDサイズは2です。私は、より大きなシード配列を持ついくつかの実装について知っています。 –

関連する問題