通常、Cで順次乱数ジェネレータをシードするときは、次の呼び出しを使用します
srand(time(NULL))
次に使用します
rand() mod N
0とN-1の間のランダムな整数を取得します。ただし、これを並行して実行すると、time(NULL)の呼び出しが互いに非常に近いため、最終的にはまったく同じ数になります。
私は線形合同乱数ジェネレーターを使ってみました:
私が選択することを知っている、いくつかの大きな整数のためにモジュラス演算子が桁を切り捨てることによって計算することができるので、迅速な結果を生成します。しかし、周期の大きいランダムなシーケンスを並列に生成するシードを確立するのは難しいと思います。次の場合、期間の長さが最大であることを知っています
- cとmは互いに素である
- a-1はmのすべての素因数で割り切れる
- mが4の倍数の場合、a-1も4の倍数でなければなりません。
(ソース:ウィキペディア)
しかし、どのようにすればすべての乱数ストリームにこの最大の特性があることを確認できますか?MPIに関して、rank
およびを組み込んでsize
線形合同法を使用して最大周期を生成するにはどうすればよいですか?ラグのあるフィボナッチまたはメルセンヌツイスターを使用して、より長い並列ランダムストリームを生成する方が簡単でしょうか?
mod
下位ビットをつかむために-とジョナサン・ダーシーが提案され、彼らははるかに少ないランダムです。代わりに、(int)乱数をmaxint / rangeで除算して、必要な範囲を取得します。割り算はかかりますが、別のPRNGに切り替えるよりも、乱数ストリームの品質を改善する方がおそらく安価なオプションです。