各スレッドが同じ乱数シーケンスを生成する必要がある並列 Fortran90 コードがあります。
特定のシードに対して、プログラムを実行するたびに同じ結果を繰り返すことが完全にできないため、スレッドセーフではないように思われる乱数ジェネレーターがあります。
スレッドセーフな RNG のコードを探して、Web 全体を (ほぼ) サーフィンすることに失敗しました。誰かが私に(へのリンクを)1つのコードを提供できますか?
前もって感謝します!
各スレッドが同じ乱数シーケンスを生成する必要がある並列 Fortran90 コードがあります。
特定のシードに対して、プログラムを実行するたびに同じ結果を繰り返すことが完全にできないため、スレッドセーフではないように思われる乱数ジェネレーターがあります。
スレッドセーフな RNG のコードを探して、Web 全体を (ほぼ) サーフィンすることに失敗しました。誰かが私に(へのリンクを)1つのコードを提供できますか?
前もって感謝します!
Fortran90 用の優れた疑似乱数ジェネレーターは、 Intel Math Kernel Vector Statistical Libraryにあります。それらはスレッドセーフです。また、なぜスレッドセーフである必要があるのですか? 各スレッドに同じリストを取得させたい場合は、スレッドごとに同じシードを持つ新しい PRNG をインスタンス化します。
ほとんどの再現可能な乱数ジェネレーターは、何らかの形で状態を必要とします。状態がなければ、彼らは次に来ることをすることができません。スレッドセーフであるためには、自分で状態を保持する方法が必要です(つまり、グローバルにすることはできません)。
Mersenne Twister/MT19973のスレッドセーフなFortran90バージョンをコーディングしました。PRNGの状態は派生型(randomNumberSequence)で保存され、プロシージャを使用してジェネレータをシードするか、シーケンス内の次の要素を取得します。
http://code.google.com/p/i3rc-monte-carlo-model/source/browse/trunk/Code/RandomNumbersForMC.f95を参照してください
乱数の同じストリームを生成するには、すべてのスレッドが必要であることを理解しています。
再現可能な数のストリームを生成し、非常に高速な、非常に優れた疑似乱数ジェネレーターはMT19937です。スレッドを生成する前にシードを生成することを確認してください。ただし、すべてのスレッドで MT の個別のインスタンスを生成します (MT スレッドのインスタンスをローカルにします)。そうすれば、すべての MT が同じ数のストリームを生成することが保証されます。
代替案は次のようです。
あまり有望なリストではないことはわかっています。それに加えて、FORTRAN でそれらを実装する方法がわかりません!