Main Content

本页采用了机器翻译。点击此处可查看英文原文。

在 parfor 循环中重复随机数

控制工作进程上的随机数流中所述,集群中执行同一项作业的每个工作进程都有一个独立的随机数生成器流。因此,默认情况下,池中的每个工作进程和 parfor 循环中的每个迭代都有一组唯一的、独立的随机数。parfor 循环的后续运行会生成不同的数字。

parfor 循环中,您无法控制迭代执行的顺序,也无法控制哪个工作进程运行哪些迭代。因此,即使您重置随机数生成器,parfor 循环也可以按照不同的序列生成相同的值。

为了在每次循环运行时在 parfor 循环中重现同一组随机数,您必须通过为每次迭代分配特定的子流来控制随机生成。

首先,使用支持子流的生成器创建您想要使用的流。将流创建为 parallel.pool.Constant 可允许所有工作进程访问该流。

sc = parallel.pool.Constant(RandStream('Threefry'))

parfor 循环内部,您可以通过循环索引设置子流索引。这确保每次迭代都使用其特定的随机数集,无论哪个工作进程运行该迭代或迭代以什么序列运行。

r = zeros(1,16);
parfor i = 1:16
    stream = sc.Value;        % Extract the stream from the Constant
    stream.Substream = i;
    r(i) = rand(stream);
end
r
r =

  Columns 1 through 8

    0.3640    0.8645    0.0440    0.7564    0.5323    0.8075    0.2145    0.9128

  Columns 9 through 16

    0.4057    0.0581    0.5515    0.4347    0.3531    0.4677    0.8287    0.2312

另请参阅

|

相关主题