Matlab中的随机变量生成器在集群环境中运行

时间:2015-03-05 12:17:48

标签: matlab random cluster-computing

我想生成"真正" matlab中的随机变量,它在集群环境中运行。问题是matlab中的随机变量是从矩阵中检索出来的,从特定位置(http://nl.mathworks.com/help/matlab/ref/rng.html)开始。

每次我开始在matlab中执行程序时,随机值总是相同的。为了解决这个问题,可以使用命令rng(' shuffle')从矩阵的随机位置开始(http://nl.mathworks.com/help/matlab/math/why-do-random-numbers-repeat-after-startup.html)。

然而,即使这个命令也会给我相同的结果,因为' shuffle'命令(不清楚它是如何工作的)在集群中始终是相同的。

关于如何克服这个问题的任何建议?

4 个答案:

答案 0 :(得分:4)

我假设这是一个问题,因为您正在使用具有相同“随机”输入的多个并行进程。确保在不同的时间在每个进程中使用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输入显然没有足够高的分辨率来快速生成新种子。

答案 1 :(得分:1)

通常你喂一个起始种子"对于随机数生成器,一个好的源是当前时间,所以你可以尝试像

这样的东西
 rng(now)

有关更多示例,请参阅here

注意:我自己没有测试过这个!

答案 2 :(得分:1)

为什么不使用来自random.org的真正随机数来播种随机数生成器,使用http://uk.mathworks.com/matlabcentral/fileexchange/27942-www-random-org-random-integers-sequences-strings

答案 3 :(得分:0)

rng('shuffle')根据当前时间为随机数生成器播种,因此我不确定为什么每次都会得到相同的结果。

无论如何,如果你想确保每个工人都有不同的种子,你不应该使用rng('shuffle')为每个工人设置随机数种子。

所以,基本上你需要全局rng('shuffle'),而不是每个工人。

每次为每个工人提供不同的值:

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

这将在所有工人的每次给你相同的价值,因为所有的工人将同时使用相同的种子进行初始化。

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