关于随机种子:在MATLAB中使用带有parfor的rng播种

Seeding in MATLAB with rng with parfor

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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个"随机"值相同。它们不必按相同的顺序排列。)我尝试在两个循环之间添加rng(myseed),但这没有帮助。


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

1
2
3
4
5
6
7
8
9
10
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
', w.ProcessId, k, r)
end

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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