代码之家  ›  专栏  ›  技术社区  ›  Mark_Anderson

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

  •  0
  • Mark_Anderson  · 技术社区  · 8 年前

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

    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 回复  |  直到 8 年前
        1
  •  1
  •   Community Mohan Dere    5 年前

    rng (随机数生成器) documentation :

    rng('default') 将随机数生成器的设置用于 rand , randi randn 设置为其默认值。这样,就会产生相同的随机数 就像重新启动MATLAB一样

    默认设置为种子为0的Mersenne扭曲器。

    所以得到的值是相同的,因为集群节点各自作用于MATLAB上的一个新实例,该实例使用 rng('默认值') 作为随机数生成器的初始化。

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


    您可能也有兴趣了解 char 作用自从你 let_array 数组等效于ASCII 97:122 ,您只需忘记字母数组,然后对 兰迪 像这样:

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