我正在使用Java编程语言实现遗传算法。如您所知,算法中存在一些随机事件,如roullete选择,交叉,变异等。为了在这些事件之间生成更好的概率分布,哪种方法应该更好,使用唯一的Random对象或创建单独的每个事件的随机对象?
答案 0 :(得分:3)
使用单个对象。随机数生成器设计为具有长周期 - 使用相同的种子实例,您可以获得良好的随机数字序列。如果你经常创造并摧毁它们,你只会在播种过程中获得更多随机性,甚至可能没有。想象一下,如果您的RNG是从系统时钟播种的,那么会发生什么,例如,您每秒都会进行数千次。
答案 1 :(得分:2)
使用全局存储的单个随机数,并在需要随机性的任何地方引用它。更重要的是,用已知种子初始化它,并将此种子与遗传算法的结果一起写入文件。
除了deong提到的好处之外,如果你发现一些有趣的输出,这可以让你完全重新运行整个程序。遗传算法看到一个有趣的结果然后无法重现它可能会非常令人沮丧,因为这是一种罕见的结果。如果你有种子,你可以确定地重新运行该程序。
如果您希望每次运行都使用新种子,您可以这样做:
long seed = new Random().nextLong();
log("Seed for the current run is: " + seed);
Global.setRandom(new Random(seed));
这样你每次都会获得一个新的随机种子,但如果需要,你仍然可以重建一个给定的运行。
请注意,不应在两个不同的运行之间共享Random对象。在每次运行开始时,您应该创建一个新的随机对象并记下种子。