【问题标题】:Random variable generator in Matlab running in cluster environmentMatlab中的随机变量生成器在集群环境中运行
【发布时间】:2015-03-05 12:17:47
【问题描述】:

我想在集群环境中运行的 matlab 中生成“真正的”随机变量。问题是 matlab 中的随机变量是从矩阵中检索的,从特定位置 (http://nl.mathworks.com/help/matlab/ref/rng.html) 开始。

每次我开始在 matlab 中执行程序时,随机值总是相同的。为了克服这个问题,可以使用命令 rng('shuffle') 从矩阵的随机位置开始 (http://nl.mathworks.com/help/matlab/math/why-do-random-numbers-repeat-after-startup.html)。

但是,即使是这个命令也会给我相同的结果,因为“shuffle”命令的结果(没有说明它是如何工作的)在集群中总是相同的。

关于如何克服这个问题的任何建议?

【问题讨论】:

    标签: matlab random cluster-computing


    【解决方案1】:

    我假设这是一个问题,因为您正在使用具有相同“随机”输入的多个并行进程。确保在不同的时间在每个进程中使用rng('shuffle')(时间差可能只有几毫秒)。 shuffle 使用当前时间作为输入,具有相当高的分辨率,如下例所示:

    rng('shuffle');rng
    rng('shuffle');rng
    
    rng(now);rng
    rng(now);rng
    

    上面的代码设置了随机种子并立即显示随机数生成器的状态及其种子。输出如下:

    ans = 
    
         Type: 'twister'
         Seed: 587753634
        State: [625x1 uint32]
    
    
    ans = 
    
         Type: 'twister'
         Seed: 587753635
        State: [625x1 uint32]
    
    
    ans = 
    
         Type: 'twister'
         Seed: 736028
        State: [625x1 uint32]
    
    
    ans = 
    
         Type: 'twister'
         Seed: 736028
        State: [625x1 uint32]
    

    如您所见,shuffle 输入产生两个不同的种子,而now 输入显然没有足够高的分辨率来如此快速地生成新种子。

    【讨论】:

    • 我没有使用多核,但是matlab默认并行化了一些任务。所以我在代码的开头只使用了一个 rng('shuffle') 但 shuffle 的输出总是相同的。正如我在另一个答案中评论的那样,每次我初始化我的代码时,集群计算机中的日期似乎都在重置。
    • 这很奇怪。也许您可以尝试rng(cputime) 设置随机种子?这将使用 MATLAB 在 CPU 上使用的时间作为种子,每次运行代码时可能不是相同的数字。
    • 根据这里的建议,我认为问题不在于matlab,而在于集群本身。也许我会删除我的问题以避免混淆其他用户。
    • 这可能是个好主意。但是,我建议使用集群细节重新提出问题(即是否有更多人可能会遇到此问题)。在我的书中,在运行 MATLAB 时重置系统时钟绝对是一种奇怪的行为,所以如果你在这方面发现任何有趣的东西,可能值得分享。
    【解决方案2】:

    通常您将起始“种子”提供给随机数生成器,一个好的来源是当前时间,因此您可以尝试类似

     rng(now)
    

    更多示例请参见here

    注意:我自己没有测试过!

    【讨论】:

    • 我也试过这个,但它不起作用。每次我初始化代码时,集群计算机中的日期似乎都在重置。还是谢谢!
    【解决方案3】:

    为什么不使用来自 random.org 的真正随机数作为随机数生成器的种子,使用 http://uk.mathworks.com/matlabcentral/fileexchange/27942-www-random-org-random-integers-sequences-strings

    【讨论】:

      【解决方案4】:

      rng('shuffle') 根据当前时间播种随机数生成器,所以我不确定为什么每次都得到相同的结果。

      无论如何,如果您想确保每个工人都有不同的种子,则不应使用rng('shuffle') 为每个工人设置随机数种子。

      所以,基本上你需要在全局范围内而不是在每个工作人员内部执行 rng('shuffle')

      这将为您每次在每个工人身上提供不同的价值:

      rng('shuffle')
      spmd
      R = rand(1,4); % Different on each worker
      end
      

      这将在所有工作人员上每次都为您提供相同的值,因为所有工作人员将同时使用相同的 rng 种子进行初始化。

      spmd
      rng('shuffle')
      R = rand(1,4); % Equal on each worker
      end   
      

      【讨论】:

        猜你喜欢
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2012-06-10
        • 2020-04-08
        • 2019-07-29
        相关资源
        最近更新 更多