在 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