3

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

% 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 
4

1 回答 1

3

这里有关于各种选项的文档。这是您可以做一些接近的事情的一种方法。

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
于 2014-02-06T14:55:11.253 回答