我有以下代码:
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循环的每次迭代中获得真正不同的随机数?
答案 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