以下代码应生成两个随机字母:
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集群上无法获得可靠的随机数。
答案 0 :(得分:1)
如rng
(随机数生成器)documentation中所述:
rng('default')
将rand
,randi
和randn
使用的随机数生成器的设置置于其默认值。这样,生成相同的随机数就像重新启动MATLAB 一样。默认设置是带有种子0的Mersenne Twister。
所以你得到的是相同的值,因为每个集群节点都在MATLAB上的一个新实例上运行,它使用rng('default')
作为随机数生成器的初始化。
如果您希望群集节点上有独立的随机性,则使用rng shuffle
或rng('shuffle')
是正确的做法。
您可能也有兴趣了解char
功能。由于您的let_array
数组等同于ASCII 97:122
,因此您可以简单地忘记字母数组并对randi
进行一次调用,如下所示:
SaveStr.random = ['_', char(randi([97,122], 1, 2))];