如果应用程序的不同类需要提取一个或多个随机数,那么随机数生成器应该在哪里初始化以产生良好的随机序列?
特别地,我需要建立一些决策树来训练随机森林。每个决策树的构造包括以下步骤:
- 加载数据集(按多行数据组织)
- 为了建立一个新的数据集,这个数据集中的一些行被随机地选中。这个新的数据集将在树的生长过程中逐渐分裂。
- 这个新数据集是用来生长决策树的:每个节点的创建需要随机选择这个新数据集的几行(在创建一个节点之前,你必须随机生成这个新数据集的一些小的不同子集)。
对每个决策树的构造执行上面列出的三个步骤。刚才描述的过程提供了随机数生成多次。例如,第二步应该确保每个决策树都使用与初始数据集略有不同的数据集进行训练,因此随机数生成器应该避免生成相等的数据集(或者在任何情况下发生这种情况的可能性应该非常低)。
本质上,在这个过程中,我们可以识别两个随机性来源:
- 生成
N
随机数据集,每训练一个决策树; - 在创建节点之前,必须从给定的数据集执行
M
随机提取。
我应该使用多少个随机数生成器?由于我有一个实现随机森林的类和另一个实现决策树的类,我认为我应该在第一个类(随机性的第一个来源)中初始化一个随机数生成器,在第二个类(随机性的第二个来源)中初始化另一个随机数生成器。这是正确的吗?
一般来说,选择正确数量的伪随机数生成器的指导原则是什么?
请记住,无论使用哪种计算机语言,生成的数字总是伪随机的。这意味着使用相同的种子生成生成,你将总是得到相同的结果。编程语言中包含的所有随机数生成器都已经过大量开发和测试,以达到尽可能最佳的效果。通过一个随机函数传递一次应该就足够了。
取决于您需要的序列的可重复性。例如,如果你不能保证rand()调用的顺序,并且需要每次生成相同的序列进行测试,那么你需要为每个这些队列单独的种子/生成器。
如果你不关心可重复性,那么只需要一个生成器,一个种子,然后让它运行。
只使用一个随机生成器,但要确保它是良好的种子。您可以将它放在main()的开头,然后生成随机数序列供以后使用,或者在运行时调用生成器。
确保不要在每次呼叫时都对其进行种子设置,因为如果您使用时间在一秒钟内进行种子设置,则容易产生相同的数字。只播种一次生成器是最佳实践。
实际上,如果您使用的是类unix系统,请考虑使用/dev/random作为生成器。不要自己编写代码,因为您使用的几乎任何系统都保证提供本机或具有生成随机性的库。
一般来说,考虑使用利用外部来源(来自计算机硬件的噪声)而不是自己计算的生成器。
所有函数只使用一个随机数生成器
使用两个或多个随机数生成器可能会导致问题。大多数随机数生成器使用系统时间作为起始种子。如果实例化两个在时间上接近的随机数类,它们可能产生相同的随机数序列。如果使用单个随机生成器,这是不可能发生的。