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