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

问题描述 投票:0回答:1

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

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集群上无法获得可靠的随机数。

matlab slurm
1个回答
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))];
© www.soinside.com 2019 - 2024. All rights reserved.