Как описано в разделе Управление потоками случайных чисел на рабочих, каждый рабочий в кластере, работающий над одним и тем же заданием, имеет независимый поток генератора случайных чисел. Поэтому по умолчанию каждый работник в пуле и каждая итерация в 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