1

我有一个parfor用于并行计算的循环Matlab。我希望parfor在 8 个工作人员的每次调用这些循环中都有不同的随机数。如果我不使用rng('shuffle')函数,我有相同的随机数randperm(10)。在这种情况下,我的代码在所有工作人员中同时运行rng('shuffle')之前的功能。randperm在这种情况下我有不同的随机数吗?当我在 parfor 循环中看到randperm输出时,其中一些输出是相同的!

我需要rng先保存并在结束并行循环后rng('shuffle')使用类似的东西?rng(saved_rng)

我们有这个Matlab帮助:

注意 因为 rng('shuffle') 会根据当前时间为随机数生成器播种,所以如果要确保独立流,则不应使用此命令在不同的 worker 上设置随机数流。当命令同时发送给多个工作人员时尤其如此,例如在 parfor、spmd 或通信作业中。对于worker上的独立流,使用默认行为;或者,如果这不足以满足您的需求,请考虑在每个工作人员上使用唯一的子流。

所以我该怎么做?如果我删除,我有不同的随机数rng吗?我有这些代码的两个版本。其中之一是计算parfor和其他使用for循环,我可以shufflefor循环中删除吗?在这种情况下我有不同的随机数?

谢谢。

附言。

我可以有这些结构:

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是相同的!

4

1 回答 1

1

要正确执行此操作,您需要选择支持并行子流的 RNG 算法(换句话说,您可以将随机流拆分为子流,并且每个子流仍然具有您希望从随机流中获得的正确统计属性) .

默认的 RNG 算法(Mersenne Twister 或mt19937ar)不支持并行子流,但 MATLAB 支持两种算法(乘法滞后 Fibonacci 生成器mlfg6331_64和组合多重递归生成器mrg32k3a)。

例如:

s = RandStream.create('mrg32k3a','NumStreams',4,'Seed','shuffle','CellOutput',true)

s现在是随机数子流的单元阵列。所有种子都有相同的种子,s{1}.Seed如果需要,您可以记录可重复性。

现在,您可以调用rand(s{1})(或randn(s{1})) 从流 1 中生成随机数,依此类推。使用 将流重置为其初始配置reset(s{1}),您应该会发现每个流都是可单独重现的。

然后,每个工作人员都可以以统计上仍然合理的方式生成随机数,并且即使并行也可以重现:

parfor i = 1:4
    rand(s{i})
end

有关更多信息,请查看加速统计计算下的统计工具箱文档。那里有几篇文章带您了解所有复杂的细节。如果您没有 Statistics Toolbox,该文档位于 MathWorks 网站上。

于 2014-09-11T09:23:54.943 回答