randi在集群上生成相同的结果

时间:2018-03-04 15:37:13

标签: matlab slurm

以下代码应生成两个随机字母:

lett_array = ['abcdefghijklmnobqrstuvwxyz'];
SaveStr.random = ['_',lett_array(randi(26)),lett_array(randi(26))];

它在我的本地计算机上完全按预期工作(将随机字母添加到保存文件名以保持唯一性)。

然而,在使用slurm调度的集群上,我得到了超过200个结果,所有结果都计算了相同的字母对数(运行时间相差15分钟;结束时间超过45分钟)。

这似乎......很奇怪。我可以使用

强制合理的行为
rng('shuffle');
lett_array = ['abcdefghijklmnobqrstuvwxyz'];
SaveStr.random = ['_',lett_array(randi(26)),lett_array(randi(26))];

但我不明白我是如何解决这个问题的。

思考?似乎是一个很大的问题,matlab在linux集群上无法获得可靠的随机数。

1 个答案:

答案 0 :(得分:1)

rng(随机数生成器)documentation中所述:

  

rng('default')randrandirandn使用的随机数生成器的设置置于其默认值。这样,生成相同的随机数就像重新启动MATLAB 一样。

     

默认设置是带有种子0的Mersenne Twister。

所以你得到的是相同的值,因为每个集群节点都在MATLAB上的一个新实例上运行,它使用rng('default')作为随机数生成器的初始化。

如果您希望群集节点上有独立的随机性,则使用rng shufflerng('shuffle')是正确的做法。

您可能也有兴趣了解char功能。由于您的let_array数组等同于ASCII 97:122,因此您可以简单地忘记字母数组并对randi进行一次调用,如下所示:

 SaveStr.random = ['_', char(randi([97,122], 1, 2))];