0

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

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

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

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

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

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

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

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

4

4 回答 4

5

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

于 2013-03-01T21:12:10.960 回答
2

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

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

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

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

于 2013-03-02T07:40:49.270 回答
2

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

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

于 2013-03-01T21:11:24.237 回答
0

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

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

于 2013-03-02T07:17:43.627 回答