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