我正在尝试在 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
但在对上述脚本的不同调用中,我仍然得到相同的数字。