exponenta event banner

Повторять случайные числа в контурах parfor-loops

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

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

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

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

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

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

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

См. также

|

Связанные темы