Повторите Случайные числа в циклах 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

Смотрите также

|

Похожие темы