同じジョブで作業しているクラスター内の各ワーカーには、独立した乱数ジェネレーター ストリームがあります。したがって、既定では、プール内の各ワーカーと parfor ループ内の各反復には、一意の独立した乱数のセットがあります。parfor ループの後続の実行では、異なる数値が生成されます。
parfor ループでは、反復を実行する順序を制御することも、どのワーカーがどの反復を実行するかを制御することもできません。そのため、乱数発生器をリセットしても、parfor ループは同じ値を異なるシーケンスで生成できます。
ループが実行されるたびに parfor ループで同じ乱数のセットを再現するには、反復ごとに特定のサブストリームを割り当てて乱数の生成を制御しなければなりません。
まず、サブストリームをサポートするジェネレーターを使用して、使用するストリームを作成します。ストリームを parallel.pool.Constant として作成すると、すべてのワーカーがストリームにアクセスできるようになります。
sc = parallel.pool.Constant(RandStream('Threefry'))
parfor ループ内では、ループ インデックスによってサブストリーム インデックスを設定できます。これにより、どのワーカーがその反復を実行するか、または反復がどのシーケンスで実行されるかに関係なく、各反復が特定の乱数セットを使用することが保証されます。
r = zeros(1,16);
parfor i = 1:16
stream = sc.Value; % Extract the stream from the Constant
stream.Substream = i;
r(i) = rand(stream);
end
https://www.mathworks.com/help/parallel-computing/repeat-random-numbers-in-parfor-loops.html