在MATLAB中跨并行调用创建随机矩阵时的可再现结果

在MATLAB中跨并行调用创建随机矩阵时的可再现结果,matlab,matrix,random,Matlab,Matrix,Random,我想创建一些随机矩阵,但它们非常大,无法放入内存,所以我想找到一种方法在计算机上复制它们,这样当我需要将它们发送到另一台机器时,我只需要发送代码。 以下是我想做的: num_of_iters = 10; K = 200; for iter = 1:num_of_iters parfor j = 1:K R = make_random_R(iter,j,.....); % Do something end end 我担心的是parfor循环,我需要

我想创建一些随机矩阵,但它们非常大,无法放入内存,所以我想找到一种方法在计算机上复制它们,这样当我需要将它们发送到另一台机器时,我只需要发送代码。 以下是我想做的:

num_of_iters = 10;
K = 200;
for iter = 1:num_of_iters
    parfor j = 1:K
        R = make_random_R(iter,j,.....);
        % Do something
    end
end
我担心的是parfor循环,我需要能够重现随机矩阵,无论parfor中的索引顺序如何。因此,我决定使用MATLAB流来实现这一点:

  • 保存全局流
  • 创建一个新的流,设置种子和适当的子流(取决于iter和j)
  • 算算
  • 把全球流放回去
这是我的代码(变量n,p,R_类型控制随机矩阵的生成方式,但它们并不重要,K与上面的变量相同,我需要它在
substream_id=(iter-1)*K+j;
)行中:


我想知道代码是否正确,它是否在函数调用后保留全局流的状态?请帮助我,非常感谢你

MATLAB从一个“已知”但“复杂”的函数生成随机数,这样你就可以生成相同的随机序列了!号码

为此,应使用“rng”功能
将rng设置为默认值,以便重置随机数生成

rng('default');
rand(1,5)
ans=
0.8147  0.9058  0.1270  0.9134  0.6324
如果你想重现这个随机数序列,你可以写:

rng('default');
rand(1,5)
ans=
    0.8147  0.9058  0.1270  0.9134  0.6324
另一种方法是获取/设置随机数生成的种子:

s=rng;
rand(1,5)
ans= 0.0975  0.2785  0.5469  0.9575  0.9649
并复制相同的序列号

rng(s);
rand(1,5)
ans=
     0.0975  0.2785  0.5469  0.9575  0.9649
注意,“rng”本身是一个丰富的函数,您可以在matlab文档中对其进行更多的研究

(我希望我能正确理解这个问题)

回答@m7913d的评论

“默认情况下,MATLAB®客户端和MATLAB工作人员使用不同的 随机数生成器,即使工作人员是本地 与客户端在同一台计算机上群集。对于客户端 默认为Mersenne捻线器生成器(“捻线器”),用于 默认情况下是组合的多个递归生成器 ('CombRecursive'或'mrg32k3a')。如果需要生成 客户机和工人中的数字流相同,您可以将其设置为1 匹配另一个。”

显然,matlab工作人员使用的函数(用于生成随机数)与matlab本身不同,因此您也可以在“rng”函数中设置默认函数

rng(5,'twister') % for using twister method to generate random number

显示您可以在parfor中复制随机数序列的新示例:

>> parfor i=1:3
rng(3,'twister');
rand(1,5)
i
end

ans =

    0.5508    0.7081    0.2909    0.5108    0.8929


ans =

     3


ans =

    0.5508    0.7081    0.2909    0.5108    0.8929


ans =

     1


ans =

    0.5508    0.7081    0.2909    0.5108    0.8929


ans =

     2
评论的重要部分:

关于“客户端工作人员”,正如我之前所说,matlab为所有客户端工作人员使用默认函数,因此结果是完全可复制的,只是创建随机数的默认函数不同于matlab自己的默认函数。这不是一个问题,您可以在matlab及其工作人员中使用rng函数设置默认函数(答案中的最后一个示例)


关于使用全局流,使用全局流没有区别,您应该使用rng函数设置种子值以获得相同的可复制结果,全局流只是指示您使用哪个函数生成随机数,matlab有大约6个函数来完成这项工作,但是如果你有自己的函数,你可以在全局流上设置它,然后再次使用rng函数在每次生成随机数时获得相同的序列


请注意,
rng
在parfor循环中有一个。恐怕这不能回答我的问题。首先,我问我的实现是否正确,而你根本没有涉及这一部分:(.其次,文档中的引用说明客户机和工作人员使用不同的随机生成器,但它没有解决这样一个事实,即在parfor循环中,每个工作人员使用的索引是完全未指定的(由于并行化)因此,为了在每次调用parfor循环时生成相同的结果,您必须以某种方式使用随机生成器中的索引。由于我们要分别在每个辅助进程上生成数字,我假设我们必须使用随机流(而不是像您使用的rng函数那样使用全局流)。@Dangmanchuong在您的实现中,您必须使用相同的种子来复制相同的随机数序列,因此,当您尝试生成新的随机数时,只需在每个循环中的代码中添加“rng(您想要的种子数)”。
rng(5,'twister') % for using twister method to generate random number
>> parfor i=1:3
rng(3,'twister');
rand(1,5)
i
end

ans =

    0.5508    0.7081    0.2909    0.5108    0.8929


ans =

     3


ans =

    0.5508    0.7081    0.2909    0.5108    0.8929


ans =

     1


ans =

    0.5508    0.7081    0.2909    0.5108    0.8929


ans =

     2