Matlab:在每个parfor循环中生成不同的随机数

时间:2018-03-13 12:02:27

标签: matlab random parfor random-seed

我有以下代码:

nruns=100
nloops=2
zz=zeros(nloops,nruns);

for wLoop=1:nloops
delete(gcp('nocreate'));
parpool(npools);
parfor wRun=1:nruns
zz(wLoop,wRun)=rand
end
end
disp('done')

size(unique(zz))

每次关闭并重新打开池时,似乎种子会重新初始化为其默认值,这样我得到的数字远远少于预期的nruns * nloops。 如果我添加

,则此行为不会更改
rng('shuffle','combRecursive')

在parfor内部或之前。 如果我在每次迭代时都没有关闭池,那么没有问题,但是每次迭代使用不同的池对于我的用法是必要的。 如何在parfor循环的每次迭代中获得真正不同的随机数?

1 个答案:

答案 0 :(得分:0)

首先,此处记录了现有行为:https://uk.mathworks.com/help/distcomp/control-random-number-streams.html。 (注意,这与MATLAB本身基本相同 - 它始终以完全确定的随机数生成器状态启动 - 尽管parfor循环中的迭代实际上并未确定地分派。)

要回答您的问题 - 您可以调整in this doc page概述的方法。这是一种方式:

% Shuffle the state at the client
rng('shuffle');
% Pick an offset
streamOffset = randi(10000);

out = zeros(10);
for idx = 1:10
    parfor jdx = 1:10
        setupRandStream(idx + streamOffset, jdx);
        out(idx, jdx) = rand;
    end
end

% Set up the global random number state to the specific stream
% and substream using combined recursive generator.
function setupRandStream(stream, substream)
s = RandStream.create('mrg32k3a', 'NumStreams', stream, ...
    'StreamIndices', stream);
s.Substream = substream;
RandStream.setGlobalStream(s);
end