集群环境下运行的Matlab随机变量发生器

集群环境下运行的Matlab随机变量发生器,matlab,random,cluster-computing,Matlab,Random,Cluster Computing,我想在matlab中生成“真正”的随机变量,它在集群环境中运行。问题是matlab中的随机变量是从一个矩阵中检索出来的,从一个特定的位置()开始 每次我开始在matlab中执行程序时,随机值总是相同的。为了克服这个问题,可以使用命令rng(‘shuffle’)从矩阵()的随机位置开始 然而,即使这个命令也会给我相同的结果,因为“shuffle”命令的结果(它的工作原理尚未阐明)在集群中总是相同的 关于如何克服这个问题,有什么建议吗?通常,您会向随机数生成器提供一个开始的“种子”,一个好的来源是当

我想在matlab中生成“真正”的随机变量,它在集群环境中运行。问题是matlab中的随机变量是从一个矩阵中检索出来的,从一个特定的位置()开始

每次我开始在matlab中执行程序时,随机值总是相同的。为了克服这个问题,可以使用命令rng(‘shuffle’)从矩阵()的随机位置开始

然而,即使这个命令也会给我相同的结果,因为“shuffle”命令的结果(它的工作原理尚未阐明)在集群中总是相同的


关于如何克服这个问题,有什么建议吗?

通常,您会向随机数生成器提供一个开始的“种子”,一个好的来源是当前时间,因此您可以尝试以下方法

 rng(now)
有关更多示例,请参见示例


注意:我自己没有测试过

我假设这是一个问题,因为您正在使用具有相同“随机”输入的多个并行进程。确保在不同的时间在每个进程中使用
rng('shuffle')
(时差可能为毫秒)
shuffle
使用当前时间作为输入,分辨率相当高,如下例所示:

rng('shuffle');rng
rng('shuffle');rng

rng(now);rng
rng(now);rng
上述代码设置随机种子,并立即显示随机数生成器及其种子的状态。结果如下:

ans = 

     Type: 'twister'
     Seed: 587753634
    State: [625x1 uint32]


ans = 

     Type: 'twister'
     Seed: 587753635
    State: [625x1 uint32]


ans = 

     Type: 'twister'
     Seed: 736028
    State: [625x1 uint32]


ans = 

     Type: 'twister'
     Seed: 736028
    State: [625x1 uint32]
如您所见,
shuffle
输入会产生两种不同的种子,而
now
输入显然没有足够高的分辨率来快速生成新种子。

rng('shuffle')
根据当前时间为随机数生成器种子,所以我不知道为什么每次你都会得到同样的结果

无论如何,如果要确保每个辅助进程具有不同的种子,则不应使用
rng('shuffle')
在每个辅助进程上设置随机数种子

因此,基本上您需要全局地执行
rng('shuffle')
,而不是在每个worker内部

这将在每个工人身上每次为您提供不同的值:

rng('shuffle')
spmd
R = rand(1,4); % Different on each worker
end
这将在所有worker上每次为您提供相同的值,因为所有worker将使用相同的rng种子同时初始化

spmd
rng('shuffle')
R = rand(1,4); % Equal on each worker
end   

为什么不使用random.org上的真正随机数为随机数生成器设定种子,使用这个

我也尝试过这个,但它不起作用。每次我初始化代码时,集群计算机中的日期似乎都在重置。谢谢你!我没有使用多核,但是默认情况下matlab会并行一些任务。因此,我在代码的开头只使用了一个rng(“shuffle”),但shuffle的输出总是相同的。正如我在另一个答案中所评论的,每次我初始化代码时,集群计算机中的日期似乎都在重置。这很奇怪。也许您可以尝试
rng(cputime)
来设置随机种子?这将使用MATLAB在CPU上的时间作为种子,这可能不是每次运行代码时的相同数字。根据这里的建议,我相信问题不在MATLAB,而在集群本身。也许我会删除我的问题以避免混淆其他用户。这可能是个好主意。但是,我建议重新询问集群的具体情况(即,是否可能有更多的人遇到此问题)。在我的书中,运行MATLAB时重置系统时钟绝对是一种奇怪的行为,因此,如果您发现这方面有什么有趣的事情,可能值得分享。