在 MATLAB 中使用 rng 和 parfor 进行播种
Seeding in MATLAB with rng with parfor
假设我在 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
上面每个循环中的第三行捕获了我应用于 a
和 b
的处理,这是特定于循环的,并且在我的实际应用程序中非常冗长。重复 a
和 b
随机化的原因是因为我想将这 2 个循环放入我可以从主程序调用的 2 个单独的文件中。我知道这里效率低下,但代码对我来说更容易理解。
如何使用 rng
使一个循环中的 a
和 b
与另一个循环中的 a
和 b
相同? (也就是说,第一个循环中 a
的 1000 "random" 值与另一个循环中 a
的 1000 "random" 值相同。它们没有以相同的顺序。)我尝试在两个循环之间添加 rng(myseed)
但这没有帮助。
我不经常使用 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
假设我在 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
上面每个循环中的第三行捕获了我应用于 a
和 b
的处理,这是特定于循环的,并且在我的实际应用程序中非常冗长。重复 a
和 b
随机化的原因是因为我想将这 2 个循环放入我可以从主程序调用的 2 个单独的文件中。我知道这里效率低下,但代码对我来说更容易理解。
如何使用 rng
使一个循环中的 a
和 b
与另一个循环中的 a
和 b
相同? (也就是说,第一个循环中 a
的 1000 "random" 值与另一个循环中 a
的 1000 "random" 值相同。它们没有以相同的顺序。)我尝试在两个循环之间添加 rng(myseed)
但这没有帮助。
我不经常使用 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