複数の PBS ジョブ間で異なる乱数を Matlab で作成しようとしています (ジョブ配列を使用しています)。各 Matlab ジョブは、次のような乱数が生成される並列 parfor ループを使用します。
parfor k = 1:10
tmp = randi(100, [1 200]);
end
ただし、結果をプロットすると、さまざまなジョブの結果が完全にランダムではないことがわかります。たとえば、結果は乱数の関数であるため、数値がまったく同じであると言って数値化することはできませんが、間違いはありません。それをプロットするとき。プロセスIDおよび/またはクロックを使用して、各ジョブでランダムシードを初期化しようとしました:
rngSeed = feature('getpid'); % OR: rngSeed = RandStream.shuffleSeed;
rng(rngSeed);
しかし、これで問題は解決しませんでした。また、shuffleSeed (時計ベース) を使用する前に、ジョブごとに異なる秒数で一時停止しようとしました。
以上のことから、parfor が何らかの形でランダム シードをいじっていると思いました。parfor のさまざまな反復で異なる乱数を確実に取得する必要がある場合、それは理にかなっています。
私の質問は、それは本当にそうですか、どうすればそれを解決し、さまざまな PBS ジョブ間でランダム性を得ることができますか?
それぞれが 2 つのワーカーで parfor を使用して 4 つのジョブを実行するEDITでは、各ジョブには独自のシード (parfor の外部に設定) がありますが、生成された数値はジョブ間で同一であることを確認しました (parfor の反復間ではなく、Matlab によって処理されます)。 .
EDIT 2 @Sam Roberts が提案したことを試して、次のコードを使用します。
matlabpool open local 2
st = RandStream('mlfg6331_64');
RandStream.setGlobalStream(st);
rng('shuffle');
parfor n = 1:4
x=randi(100,[1 10]);
fprintf('%d ',x(:)');
fprintf('\n')
end
matlabpool close
しかし、上記のスクリプトへのさまざまな呼び出しで同じ番号を取得します。