Как описано в 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