Повторение случайных чисел в циклы parfor

Как описано в Control Random Number Streams on Workers, каждый рабочий процесс в кластере, работающий над одним и тем же заданием, имеет независимый поток генератора случайных чисел. Поэтому по умолчанию каждый рабочий процесс в пуле и каждая итерация в parfor-цикл имеет уникальный, независимый набор случайных чисел. Последующие запуски parfor-цикл генерируют различные числа.

В parfor-цикл, вы не можете контролировать, в какой последовательности выполняются итерации, и вы не можете контролировать, какой рабочий запускает какие итерации. Поэтому, даже если вы сбрасываете генераторы случайных чисел, parfor-цикл может сгенерировать одинаковые значения в другой последовательности.

Чтобы воспроизвести тот же набор случайных чисел в parfor-loop каждый раз, когда цикл запускается, вы должны управлять случайной генерацией, назначая конкретный субпоток для каждой итерации.

Во-первых, создайте поток, который вы хотите использовать, с помощью генератора, который поддерживает субпотоки. Создание потока как a parallel.pool.Constant позволяет всем рабочим обращаться к потоку.

sc = parallel.pool.Constant(RandStream('Threefry'))

Внутри parfor-loop, можно задать индекс substream по индексу цикла. Это гарантирует, что каждая итерация использует свой конкретный набор случайных чисел, независимо от того, какой рабочий процесс запускает эту итерацию или какие итерации последовательности выполняются.

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

См. также

|

Похожие темы