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

randi generating the same result on a cluster

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

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 簇上获得可靠的随机数似乎是个大问题。

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

rng('default') puts the settings of the random number generator used by rand, randi, and randn to their default values. This way, the same random numbers are produced as if you restarted MATLAB.

The default settings are the Mersenne Twister with seed 0.

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

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


您可能也有兴趣了解 char 函数。由于您的 let_array 数组等同于 ASCII 97:122,您可以简单地忘记字母数组并像这样对 randi 进行一次调用:

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