2

我正在尝试在 Matlab 中创建随机数,这在多个 PBS 作业中会有所不同(我正在使用作业数组)。每个 Matlab 作业都使用一个并行 parfor 循环,其中生成随机数,如下所示:

parfor k = 1:10      
  tmp = randi(100, [1 200]);
end

然而,当我绘制我的结果时,我发现来自不同工作的结果并不是完全随机的 - 我无法量化它,例如说数字完全相同,因为我的结果是随机数的函数,但它是正确的绘制它时。我尝试使用进程 ID 和/或时钟初始化每个作业中的随机种子:

rngSeed = feature('getpid'); % OR: rngSeed = RandStream.shuffleSeed;
rng(rngSeed);

但这并没有解决问题。在使用 shuffleSeed(基于时钟)之前,我还尝试在每个作业中暂停不同的秒数。

所有这一切让我觉得 parfor 在某种程度上弄乱了随机种子 - 如果 parfor 需要确保您在 parfor 的不同迭代中获得不同的随机数,这是有道理的。

我的问题是,真的是这样吗?我怎样才能解决它并在不同的 PBS 工作中获得随机性?

编辑运行 4 个作业,每个作业使用 parfor 和 2 个工人,我验证虽然每个作业都有它自己的种子(设置在 parfor 之外),但生成的数字在作业之间是相同的(不是跨 parfor 的迭代 - 由 Matlab 处理) .

编辑 2尝试@Sam Roberts 的建议,我使用以下代码:

matlabpool open local 2
st = RandStream('mlfg6331_64');
RandStream.setGlobalStream(st);
rng('shuffle');

parfor n = 1:4       
  x=randi(100,[1 10]);
  fprintf('%d ',x(:)');
  fprintf('\n')
end
matlabpool close

但在对上述脚本的不同调用中,我仍然得到相同的数字。

4

1 回答 1

1

您可能希望考虑使用随机子流,以在并行运行时获得正确的随机性和可重复性。

该类RandStream允许您创建伪随机数流 - 从该流中提取的数字具有您希望的属性(独立性等),并且如果您控制种子,您还具有可重复性。

但情况可能并非如此,例如,从流中抽取的每一秒或每第四个数字都具有相同的属性。此外,当您使用时,parfor您无法控制循环迭代的运行顺序,这意味着您将失去可重复性。parfor您可以在循环内的每个工作人员上使用不同的子流。

一些 RNG,例如mlfg6331_64,乘法滞后 Fibonacci 生成器,或者mrg32k3a,组合的多重递归生成器,支持子流- 由相同 RNG 生成的独立流,但保留相同的伪随机属性并且可以单独选择,保持可重复性。此外,许多 MATLAB 和 Toolbox 函数都有一个选项'UseParallel''UseSubstreams',它会告诉他们自动为你做这些事情。

尽管上述内容在 MATLAB 文档中以技术级别进行了记录,但很难找到。Statistics Toolbox 文档中有更多解释性指南(如果你问我,应该真的移到 MATLAB)。你可以在这里在线阅读。

希望有帮助!

于 2013-06-18T10:08:29.647 回答