1

parfor並列計算用のループがありますMatlabparfor8 つのワーカーでこれらのループを呼び出すたびに、異なる乱数を使用したいと考えています。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ループは削除できますか? この状態で異なる乱数がありますか?shufflefor

ありがとう。

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と同じです!

4

1 に答える 1