如果应用程序的不同类需要提取一个或多个随机数,那么应该在哪里初始化随机数生成器以产生良好的随机序列?
特别是,我需要构建一些决策树来训练随机森林。每个决策树的构建包括以下步骤:
执行上面列出的三个步骤以构建每个决策树。刚刚描述的过程提供了随机数生成多次。例如,第二步应该确保每个决策树都使用与初始数据集略有不同的数据集进行训练,因此随机数生成器应该避免生成相同的数据集(或者在任何情况下,这种情况发生的可能性应该非常低)
实质上,在这个过程中,我们可以确定两个随机源:
N
随机数据集,每个数据集用于训练单个决策树; M
随机提取。我应该使用多少个随机数生成器? 由于我有一个实现随机森林的类,以及另一个实现决策树的类,我以为我会在第一个类(第一个随机源)中初始化一个随机数生成器,在第二个类中初始化另一个随机数生成器class(随机性的第二个来源)。这是对的吗?
一般来说,选择正确数量的伪随机数生成器有哪些指导原则?
答案 0 :(得分:5)
请记住,无论您使用何种计算机语言,生成的数字总是伪随机的。这意味着给定用于生成代的相同种子,您将始终获得相同的结果。编程语言中包含的所有随机数生成器已经大量开发并经过测试,以尽可能优化。一次随机函数就足够了。
答案 1 :(得分:2)
取决于您需要序列的可重复性。例如如果你不能保证rand()调用的顺序,并且每次需要生成相同的序列进行测试,那么你需要为每个队列分别设置一个种子/生成器。
如果您不关心重复性,那么只需要一个发电机,一个种子,让它运行。
答案 2 :(得分:2)
只使用一个随机发生器,但要确保它的播种良好。您可以将它放在main()的开头,然后生成随机数序列以供以后使用,或者随时调用生成器。
每次打电话时都要确保不播种它,因为如果你在一秒钟内播种时使用时间很容易产生相同的数字,例如。仅将发电机播种一次是最佳做法。
事实上,如果您使用的是类Unix系统,请考虑为您的生成器使用/dev/random。不要编写自己的代码,因为您使用的任何系统都可以保证提供本机或具有用于生成随机性的库。
通常,考虑使用利用外部源(来自计算机硬件的噪声)的发生器而不是计算自己的。
答案 3 :(得分:0)
只为所有功能使用一个随机数生成器。
使用两个或更多随机数生成器可能会导致问题。大多数随机数生成器使用系统时间作为起始种子。如果您及时实例化两个随机数字类,它们可能会产生相同的随机数序列。使用单个随机生成器不可能发生这种情况。