【问题标题】:Different (pseudo) random numbers in parallel loops in MatlabMatlab中并行循环中的不同(伪)随机数
【发布时间】:2014-03-03 11:07:29
【问题描述】:

并行循环中请求随机数总是返回相同的伪随机数。我怎样才能避免这种情况?

% workers initialization:
if matlabpool('size') == 0
    matlabpool('open',2);
else
    matlabpool('close');
    matlabpool('open',2);
end

% parallel loop always give the same random numbers...
parfor k = 1:10
    fprintf([num2str(rand(1,1)), ' ']);
end

一个理想的解决方案是在每个线程中按 CPU 时间或类似时间初始化伪随机数生成器。 rng('shuffle') 之类的东西在这里似乎没有帮助......

控制台输出:

Sending a stop signal to all the workers ... stopped.
Starting matlabpool using the 'local' profile ... connected to 2 workers.
0.32457 0.66182 0.63488 0.64968 
0.26459 0.096779 0.50518 0.48662 0.034895 0.85227 

【问题讨论】:

标签: matlab random parallel-processing parfor


【解决方案1】:

这里有关于各种选项的documentation here。这是您可以做一些接近的一种方法。

numWorkers = matlabpool('size');
[streams{1:numWorkers}] = RandStream.create('mrg32k3a', ...
    'Seed', 'shuffle', 'NumStreams', numWorkers);
spmd
    RandStream.setGlobalStream(streams{labindex});
end

或者,为了避免在客户端创建所有流,您可以这样做:

rng('shuffle'); % shuffle the client
workerSeed = randi([0, 2^32-1]);
spmd
    stream = RandStream.create('mrg32k3a', ...
        'Seed', workerSeed, ...
        'NumStreams', numlabs, ...
        'StreamIndices', labindex);
    RandStream.setGlobalStream(stream);
end

【讨论】:

  • 谢谢,真的很有帮助!老实说,我真的不明白你的方法之间的区别。
  • 主要区别在于,在第二种情况下,我在每个工作人员上构建单独的 RandStream 对象,而不是在客户端构建所有对象并将它们发送过来。如果您有大量工人,这将更加重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多