我在parfor
中有一个Matlab
循环用于并行计算。我希望在每个调用8个worker上的parfor
循环时有不同的随机数。如果我不使用rng('shuffle')
函数,则randperm(10)
具有相同的随机数。在这种情况下,我的代码在所有工作者中同时在rng('shuffle')
之前运行randperm
函数。在这种情况下我有不同的随机数吗?当我在parfor循环中看到randperm
输出时,其中一些输出是相同的!
我需要在rng
之前保存rng('shuffle')
并在结束并行循环后使用类似rng(saved_rng)
的内容吗?
我们在Matlab
帮助中有这个:
注意因为rng('shuffle')基于随机数生成器播种 在当前时间,您不应该使用此命令来设置随机 如果你想保证独立,不同工人的数字流 流。当命令发送到多个时,尤其如此 工人同时工作,例如在parfor,spmd或a 沟通工作。对于工人的独立流,请使用 默认行为;或者如果这不足以满足您的需求, 考虑在每个工人身上使用一个独特的子流。
那我该怎么办?如果删除rng
,我有不同的随机数吗?我有这两个版本的代码。其中一个是使用parfor
进行计算,另一个使用for
循环进行计算,我可以从shuffle
循环中删除for
吗?在这种情况下我有不同的随机数?
感谢。
的PS。
我可以拥有这些结构:
parfor I=1:X
xx = randperm(10)
end
parfor I=1:X
rng('shuffle');
xx = randperm(10)
end
rng('shuffle');
parfor I=1:X
xx = randperm(10)
end
我希望randperm
函数中包含不同的随机数。我怎样才能做到这一点?对于for
结构,我需要shuffle
函数(没有它,随机数是相同的)但是当我将它添加到parfor
时,randperm
的一些随机输出是相同的!< / p>
答案 0 :(得分:1)
要正确执行此操作,您需要选择支持并行子流的RNG算法(换句话说,您可以将随机流拆分为子流,并且每个子流仍然具有您想要的正确统计属性随机流)。
默认的RNG算法(Mersenne Twister,或mt19937ar
)不支持并行子流,但MATLAB支持两种算法(乘法滞后Fibonacci生成器mlfg6331_64
和组合多重递归生成器{{ 1}})。
例如:
mrg32k3a
s = RandStream.create('mrg32k3a','NumStreams',4,'Seed','shuffle','CellOutput',true)
现在是随机数子流的单元数组。所有都有相同的种子,如果需要,您可以记录s
的重现性。
现在,您可以调用s{1}.Seed
(或rand(s{1})
)从流1生成随机数,依此类推。使用randn(s{1})
将流重置为其初始配置,您会发现每个流都可以单独重现。
然后,每个工作人员都可以以统计上合理的方式生成随机数,并且即使并行也可以重现:
reset(s{1})
有关详细信息,请查看“加速统计计算”下的“统计工具箱”文档。这里有一些文章带您了解所有复杂的细节。如果您没有统计工具箱,则该文档将在MathWorks网站上联机。