代码之家  ›  专栏  ›  技术社区  ›  yurnero

使用带parfor的rng在matlab中播种

  •  0
  • yurnero  · 技术社区  · 7 年前

    假设我在matlab中有以下代码:

    clc; clear;
    myseed = rng(1);
    c = 1; d = 2;
    parfor i = 1:1000
       a = randn(200,1);
       b = randn(50,1);
       c*(sum(a)+sum(b));
    end
    parfor i = 1:1000
       a = randn(200,1);
       b = randn(50,1);
       d*(sum(a)+sum(b));
    end
    

    上面每个循环中的第三行捕获我应用于的处理 a b ,这是特定于循环的,在我的实际应用程序中非常冗长。重复随机化的原因 因为我想把这两个循环放到两个独立的文件中,我可以从主程序调用它们。我知道这里有一些效率低下的地方,但是代码对我来说更容易理解。

    rng 所以 在一个循环中与 在另一个循环中?(即,1000个“随机”值 从第一个循环开始,与1000个“随机”值相同 从另一个循环。他们不必按同样的顺序排列。)我试着补充说 rng(myseed) 在两个循环之间,但这没有帮助。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Luis Mendo    7 年前

    我不使用 parfor 通常,但以下方法(改编自 here )似乎有效:

    parpool('local',4); % create parallel pool of workers
    spmd
        rng(123); % set the same seed in each worker
    end
    parfor k = 1:12
        r = rand; % generate a random number
        w = getCurrentWorker;
        fprintf('Worker %i, iteration %i, random number %f\n', w.ProcessId, k, r)
    end
    

    注意每个工人如何以相同的顺序生成相同的随机数。(迭代随机分配给工作人员,并以随机顺序运行;这是 by design )

    Starting parallel pool (parpool) using the 'local' profile ...
    connected to 4 workers.
    Worker 11688, iteration 1, random number 0.275141
    Worker 17188, iteration 2, random number 0.275141
    Worker 18408, iteration 4, random number 0.275141
    Worker 18408, iteration 3, random number 0.423046
    Worker 5812, iteration 6, random number 0.275141
    Worker 5812, iteration 5, random number 0.423046
    Worker 11688, iteration 8, random number 0.423046
    Worker 11688, iteration 7, random number 0.973406
    Worker 17188, iteration 9, random number 0.423046
    Worker 18408, iteration 10, random number 0.973406
    Worker 5812, iteration 11, random number 0.973406
    Worker 17188, iteration 12, random number 0.973406
    
    推荐文章