にparfor
並列計算用のループがありますMatlab
。parfor
8 つのワーカーでこれらのループを呼び出すたびに、異なる乱数を使用したいと考えています。rng('shuffle')
関数を使用しない場合、 に対して同じ乱数がありrandperm(10)
ます。この場合、私のコードはすべてのワーカーで同時にrng('shuffle')
関数を実行します。randperm
この状態で異なる乱数がありますか? parfor ループで出力を見るrandperm
と、これらの出力の一部は同じです!
rng
前に保存して、並列ループを終了した後にrng('shuffle')
何かを使用する必要がありますか?rng(saved_rng)
これがMatlab
役に立ちます:
rng('shuffle') は現在の時刻に基づいて乱数ジェネレーターをシードするため、独立したストリームを確保したい場合は、このコマンドを使用して異なるワーカーに乱数ストリームを設定しないでください。これは、コマンドが parfor、spmd、または通信ジョブ内など、複数のワーカーに同時に送信される場合に特に当てはまります。ワーカーの独立したストリームには、デフォルトの動作を使用します。または、それがニーズに十分でない場合は、各ワーカーで一意のサブストリームを使用することを検討してください。
それで、私は何をすべきですか?を削除すると乱数が異なりrng
ますか? これらのコードには 2 つのバージョンがあります。それらの1つはループを使用した計算でparfor
あり、ループを使用したfor
ループは削除できますか? この状態で異なる乱数がありますか?shuffle
for
ありがとう。
Ps。
私はこれらの構造を持つことができます:
parfor I=1:X
xx = randperm(10)
end
parfor I=1:X
rng('shuffle');
xx = randperm(10)
end
rng('shuffle');
parfor I=1:X
xx = randperm(10)
end
関数とは異なる乱数が必要ですrandperm
。どうやってやるの?for
構造には関数が必要ですshuffle
(それがなければ乱数は同じです)が、それをparfor
いくつかのランダム出力に追加するrandperm
と同じです!