parfor ループでスクランブルされた準モンテカルロ数を生成する際に問題が発生しています。
問題は、parfor ループ内でこれらの数値のセットを複数生成すると、各セットの数値が同じになってしまうことです。以下に非常に簡単な例を示します。
D = 3;
M = 1000;
numbers = cell(1,4);
mystream = qrandstream(scramble(sobolset(D),'MatousekAffineOwen'));
myfun = @(x) qrand(mystream,x);
parfor i = 1:4
numbers{i} = myfun(M);
end
この問題を示すために、このコードを実行した後、numbers{1}、numbers{2}、numbers{3}、numbers{4} の数字は次のように同じになります。
>>numbers{1}(1:3,:)
ans =
0.76 0.05 0.77
0.33 0.96 0.23
0.60 0.72 0.52
>> numbers{2}(1:3,:)
ans =
0.76 0.05 0.77
0.33 0.96 0.23
0.60 0.72 0.52
誰かがこの問題の修正を考えられるかどうか疑問に思っています。通常のランダムな数値ストリームを使用すると問題が発生しないため、何かできることがあるはずです。
準乱数ストリームの「スキップ」または「リープ」プロパティのようなものを悪用することはできません。その理由は、並列で実行するより大きな MATLAB プログラムで上記のコードのスニペットを使用しているためです...