【问题标题】:How many random number generators should I use?我应该使用多少个随机数生成器?
【发布时间】:2013-03-01 21:09:18
【问题描述】:

如果应用程序的不同类需要提取一个或多个随机数,应该在哪里初始化随机数生成器以产生良好的随机序列?

特别是,我需要构建一些决策树来训练随机森林。每个决策树的构建涉及以下步骤:

  1. 数据集(按多行数据组织)已加载。
  2. 为了构建新数据集,随机选择了此数据集中的某些行。这个新的数据集将在树的生长过程中逐渐分裂。
  3. 这个新数据集用于生成决策树:每个节点的创建需要随机选择这个新数据集的几行(在创建一个节点之前,您必须随机生成这个新数据集的一些小的不同子集)。

上面列出的三个步骤是针对每个决策树的构建执行的。刚刚描述的过程规定随机数生成发生多次。例如,第二步应确保每个决策树都使用与初始数据集略有不同的数据集进行训练,因此随机数生成器应避免生成相等的数据集(或者在任何情况下,这种情况发生的可能性应该非常低) .

本质上,在这个过程中,我们可以识别出两个随机性来源:

  • 生成N随机数据集,每个数据集训练一个决策树;
  • 在创建节点之前,您必须从给定的数据集中执行M 随机提取。

我应该使用多少个随机数生成器? 由于我有一个实现随机森林的类和另一个实现决策树的类,我想我会在第一个类(第一个随机源)中初始化一个随机数生成器,在第二个类中初始化另一个随机数生成器类(随机性的第二个来源)。这是正确的吗?

一般来说,选择正确数量的伪随机数生成器的准则是什么?

【问题讨论】:

  • int main () { srand (time(NULL)); /**/}
  • 两个随机数生成器不比一个随机数生成器随机
  • 我喜欢“Mersenne Twister”PRNG。它的周期很长,为 2^19937 − 1。如果需要,可以将其设为多个同时运行的对象。

标签: c++ algorithm random prng


【解决方案1】:

请记住,无论您使用哪种计算机语言,生成的数字始终是伪随机的。这意味着给定用于产生一代的相同种子,您将始终获得相同的结果。编程语言中包含的所有随机数生成器都已经过大量开发和测试,以尽可能优化。一个随机函数的pass就足够了。

【讨论】:

    【解决方案2】:

    取决于您需要序列的可重复性。例如如果您不能保证 rand() 调用的顺序,并且每次都需要生成相同的序列进行测试,那么您需要为每个队列使用单独的种子/生成器。

    如果您不关心可重复性,那么只需一个生成器、一个种子,然后让它运行。

    【讨论】:

      【解决方案3】:

      只使用一个随机生成器,但要确保它的种子很好。您可以将它放在 main() 的开头,然后生成随机数序列供以后使用,或者随时调用生成器。

      确保不要在每次调用它时为其播种,例如,如果您使用 time 在一秒钟内播种,则很容易产生相同的数字。最好只为您的生成器播种一次。

      事实上,如果您使用的是类 Unix 系统,请考虑为您的生成器使用/dev/random。不要自己编写代码,因为您使用的几乎任何系统都保证提供本机或具有用于产生随机性的库。

      一般来说,考虑使用利用外部源(来自计算机硬件的噪声)的生成器,而不是自己计算。

      【讨论】:

        【解决方案4】:

        所有函数只使用一个随机数生成器。

        使用两个或更多随机数生成器可能会导致问题。大多数随机数生成器使用系统时间作为起始种子。如果您实例化两个在时间上靠得很近的随机数类,它们可能会产生相同的随机数序列。使用单个随机生成器这不可能发生。

        【讨论】:

          猜你喜欢
          • 2022-06-11
          • 1970-01-01
          • 1970-01-01
          • 2023-01-03
          • 1970-01-01
          • 2015-03-14
          • 1970-01-01
          • 2016-07-22
          • 1970-01-01
          相关资源
          最近更新 更多