随机数生成函数兰德
,兰迪
,randn
与MATLAB相比,并行计算的行为是不同的®客户端。您可以在并行工作人员或客户端上更改随机数生成器的行为,以生成可重复的随机数流。
默认情况下,MATLAB客户端和MATLAB工作人员使用不同的随机数生成器,即使工作人员是与客户端在同一台机器上的本地集群的一部分。下表总结了客户端和工作人员的默认设置:
发电机 | 种子 | 正常的变换 | |
---|---|---|---|
客户端 | “旋风” 或“mt19937ar” |
0 |
“神” |
工作人员(本地或远程) | “Threefry” 或“Threefry4x64_20” |
0 |
“反转” |
有关可用生成器和普通转换的更多信息,请参见选择随机数生成器.集群中的每个工作人员都从具有表中的属性的独立流中抽取随机数。a中每个worker上生成的随机数parfor
每个循环和客户端生成的随机数都不一样。
请注意
如果你的工作器上有一个GPU,不同的设置适用于GPU上的随机数流。有关更多信息,请参见GPU上的随机数流.
如果需要在客户端和工作人员中生成相同的数字流,您可以设置一个匹配另一个。您可以设置生成器算法和种子使用rng
.
例如,您可能在一个worker上作为批处理作业运行一个脚本,并且需要与客户机相同的生成器或序列。假设您从一个名为randScript1.m
它包含以下行:
R =兰德(1,4);
您可以在客户端运行此脚本,然后在worker上作为批处理作业运行。注意,在结果中生成的默认随机数序列是不同的。
randScript1;%客户R
R = 0.8147 0.9058 0.1270 0.9134
parallel.defaultClusterProfile (“本地”) c = parcluster();j =批(c,“randScript1”);%对工人等待(j);负载(j);R
R = 0.1349 0.6744 0.9301 0.5332
对于相同的结果,您可以设置客户机和工作者使用相同的生成器和种子。在这里,文件randScript2.m
包含以下代码:
rng (1,“Threefry”);R =兰德(1,4);
现在,在客户端和worker上运行新脚本:
randScript2;%客户R
R = 0.1404 0.8197 0.1073 0.4131
j =批(c,“randScript2”);%对工人等待(j);负载(j);R
R = 0.1404 0.8197 0.1073 0.4131
默认情况下,集群中工作于同一作业的每个worker都有一个独立的随机数流。如果兰德
,兰迪
,或randn
并行调用时,每个工人产生一个唯一的随机数序列。
请注意
因为rng(“洗牌”)
基于当前时间的随机数生成器种子,如果你想确保独立的流,不要使用此命令在不同的worker上设置随机数流。当命令同时发送给多个worker时尤其如此,例如在parfor
,spmd
,或者是一份沟通工作。对于worker上的独立流,使用默认行为;或者,如果这还不足以满足您的需求,可以考虑在每个worker上使用唯一的子流RandStream
.
这个例子在一个并行池中使用了两个worker来显示它们生成了唯一的随机数序列。
p = parpool (2);spmdR =兰德(1,4);每个工人不同结束R {1}, {2}
Ans = 0.1349 0.6744 0.9301 0.5332
删除(p)
如果你需要所有工人生成相同的数字序列,你可以设置每个工人使用相同的生成器设置:
p = parpool (2);spmdrng (0,“Philox”);默认种子0。R =兰德(1,4);所有工人都一样结束R {1}, {2}
Ans = 0.3655 0.6975 0.1789 0.4549
删除(p)
如果你需要在a的每次迭代中控制随机数parfor
循环,看在parfor循环中重复随机数.
如果你用的是正态分布的随机数randn
函数,您可以使用与上面相同的方法使用RandStream
在每个worker和客户端上设置生成器类型、种子和普通转换算法。
例如,假设这个文件randScript3.m
包含的代码:
流= RandStream (“Threefry”,“种子”0,“NormalTransform”,“反转”);RandStream.setGlobalStream(流);R = randn (7)
批处理
或spmd
)以产生相同的随机数序列:R = -0.3479 0.1057 0.3969 0.6544 -1.8228 0.9587 0.5360