在MATLAB中使用带有parfor的rng播种

时间:2018-05-28 16:36:31

标签: matlab random-seed modular-design

假设我在MATLAB中有以下代码:

clc; clear;
myseed = rng(1);
c = 1; d = 2;
parfor i = 1:1000
   a = randn(200,1);
   b = randn(50,1);
   c*(sum(a)+sum(b));
end
parfor i = 1:1000
   a = randn(200,1);
   b = randn(50,1);
   d*(sum(a)+sum(b));
end

上面每个循环中的第三行捕获我应用于ab的处理,这是特定于循环的,并且在我的实际应用程序中非常冗长。重复ab随机化的原因是因为我想将这两个循环放入我可以从主程序调用的两个单独的文件中。我知道这里有一些效率低下但代码对我来说更容易理解。

如何使用rng以便在一个循环中ab与另一个循环中的ab相同? (也就是说,来自第一个循环的a的1000"随机"值与来自另一个循环的a的1000" random"值相同他们不必处于相同的顺序。)我尝试在两个循环之间添加rng(myseed)但这没有帮助。

1 个答案:

答案 0 :(得分:1)

我不经常使用parfor,但以下方法(改编自here)似乎有效:

parpool('local',4); % create parallel pool of workers
spmd
    rng(123); % set the same seed in each worker
end
parfor k = 1:12
    r = rand; % generate a random number
    w = getCurrentWorker;
    fprintf('Worker %i, iteration %i, random number %f\n', w.ProcessId, k, r)
end

请注意每个工作人员如何以相同的顺序生成相同的随机数。 (迭代被随机分配给工人,并以随机顺序运行;这是by design)。

Starting parallel pool (parpool) using the 'local' profile ...
connected to 4 workers.
Worker 11688, iteration 1, random number 0.275141
Worker 17188, iteration 2, random number 0.275141
Worker 18408, iteration 4, random number 0.275141
Worker 18408, iteration 3, random number 0.423046
Worker 5812, iteration 6, random number 0.275141
Worker 5812, iteration 5, random number 0.423046
Worker 11688, iteration 8, random number 0.423046
Worker 11688, iteration 7, random number 0.973406
Worker 17188, iteration 9, random number 0.423046
Worker 18408, iteration 10, random number 0.973406
Worker 5812, iteration 11, random number 0.973406
Worker 17188, iteration 12, random number 0.973406