Main Content

parfor ループでの乱数の繰り返し

ワーカー上の乱数ストリームの制御で説明しているように、同じジョブを処理しているクラスターの各ワーカーには独立した乱数発生器ストリームがあります。そのため、既定ではプールの各ワーカーおよび 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
r
r =

  Columns 1 through 8

    0.3640    0.8645    0.0440    0.7564    0.5323    0.8075    0.2145    0.9128

  Columns 9 through 16

    0.4057    0.0581    0.5515    0.4347    0.3531    0.4677    0.8287    0.2312

参考

|

関連するトピック