【问题标题】:matlab: different instances start with the same random seedmatlab:不同的实例以相同的随机种子开始
【发布时间】:2020-11-03 11:45:03
【问题描述】:

使用 MATLAB 并尝试使用计算机集群执行 100 次重复具有固有随机性的某些计算。这些重复中的每一个都应包含相同的代码,但具有不同的随机种子。 看来

rng('shuffle')

recommended by documentation 如果所有作业同时开始运行(在不同的机器上),则可能无法实现这一点,因为使用的种子是一个似乎是从时间初始化的整数(它单调增加,似乎精度为 100 分之一)一秒钟。

精度似乎合理,但如果同时运行 100-1000 个实例,“冲突”仍然很可能发生,从而破坏了独立的结果统计解释。

有什么方法可以避免这种冲突,而无需手动为每个实例提供一个用作种子的“实例 ID”?

【问题讨论】:

  • 不要从时间开始播种。为每台机器分配一个唯一编号,并使用(时间+编号)为每台机器的 RNG 播种。将数字分散开,相距足够远,不太可能赶上下一个数字。
  • 我同意,但如何用 Matlab 实际做到这一点?它如何访问这样的每台机器唯一编号?
  • 阅读我的答案...序列号或处理器ID

标签: matlab random cluster-computing random-seed


【解决方案1】:

我通常会尝试从机器或硬盘上获取一些序列号,例如

dos('wmic bios get serialnumber')

dos('wmic cpu')

ProcessorId 例如“BFEBFBFF000506E3”是另一种可以使用的 在您的集群中有所不同。因此,可能的多核使用 NumberOfCores 分裂并有不同的种子,也许。

【讨论】:

  • 以某种方式将其与时间相结合以获得唯一的种子,即使计算节点被重复用于作业子步骤。
【解决方案2】:

无论您为种子选择什么,它都只能采用 32 位值,即使它会初始化具有更大状态的生成器,例如 Mersenne Twister('twister',19937 位)。正如 M. O'Neill 在“C++ Seeding Surprises”中所讨论的,32 位种子存在某些问题。据推测,基于时间的种子同样是 32 位长。短种子意味着只能生成有限数量的伪随机序列。

rng 似乎不支持超过 32 位的种子。另一方面,最新版本的 MATLAB 支持 random number streams,除其他外,如果您“想要在模拟中单独的随机源”,则设计它们。出于您的目的,请选择支持多个流的生成器,例如mrg32k3a,并按如下方式创建随机数流(另请参阅"Multiple Streams"):

[stream1, stream2]=RandStream.create('mrg32k3a','NumStreams',2)

【讨论】:

  • 您可以将'CellOutput',true 添加到函数调用中,然后输出是包含所有流的单个元胞数组。当 OP 似乎需要生成 100 或 1000 个流时更方便。
猜你喜欢
  • 2011-06-13
  • 2012-12-09
  • 2018-03-05
  • 2015-10-12
  • 2019-05-31
  • 1970-01-01
  • 2016-09-16
  • 2021-12-24
  • 2012-11-02
相关资源
最近更新 更多