我想生成"真正" 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'命令(不清楚它是如何工作的)在集群中始终是相同的。
关于如何克服这个问题的任何建议?
答案 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)
答案 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