0

假设我在 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

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

如何在一个循环中使用rngsoa和在另一个循环中的andb相同?(也就是说,第一个循环的 1000 个“随机”值与另一个循环的 1000 个“随机”值相同。它们不必按相同的顺序。)我尝试在 2循环,但这没有帮助。abaarng(myseed)

4

1 回答 1

1

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

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

请注意每个工人如何以相同的顺序生成相同的随机数。(迭代随机分配给工人,并以随机顺序运行;这是设计使然)。

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
于 2018-05-28T17:29:01.827 回答