Java 遗传算法使用一个或多个随机数生成器?

Java 遗传算法使用一个或多个随机数生成器?,java,random,genetic-algorithm,Java,Random,Genetic Algorithm,我正在用Java编程语言实现一个遗传算法。如您所知,算法中有一些随机事件,如轮盘选择、交叉、变异等。为了在这些事件中生成更好的概率分布,哪种方法更好,使用唯一的随机对象还是为每个事件创建单独的随机对象?使用单个对象。随机数生成器被设计为具有长周期——使用相同的种子实例,可以得到一个良好的随机数字序列。如果你不断地创造和破坏它们,你只会得到播种过程中的随机性,甚至可能没有。想象一下,如果您的RNG是从系统时钟中播种的,并且您每秒执行数千次,会发生什么情况 使用全局存储的单个随机变量,并在需要随机性

我正在用Java编程语言实现一个遗传算法。如您所知,算法中有一些随机事件,如轮盘选择、交叉、变异等。为了在这些事件中生成更好的概率分布,哪种方法更好,使用唯一的随机对象还是为每个事件创建单独的随机对象?

使用单个对象。随机数生成器被设计为具有长周期——使用相同的种子实例,可以得到一个良好的随机数字序列。如果你不断地创造和破坏它们,你只会得到播种过程中的随机性,甚至可能没有。想象一下,如果您的RNG是从系统时钟中播种的,并且您每秒执行数千次,会发生什么情况

使用全局存储的单个随机变量,并在需要随机性的任何地方引用它。更重要的是,用一个已知的种子初始化它,并将这个种子和遗传算法的结果一起写入一个文件

除了deong提到的好处之外,如果您发现一些有趣的输出,还可以完全重新运行整个程序。遗传算法看到一个有趣的结果却无法重现,这可能会让人非常沮丧,因为这是一个罕见的结果。如果你有种子,你可以决定重新运行程序

如果希望每次运行都使用新种子,可以按如下方式进行:

long seed = new Random().nextLong();
log("Seed for the current run is: " + seed);
Global.setRandom(new Random(seed));
这样,您每次都会得到一个新的随机种子,但如果需要,您仍然可以重建给定的运行


请注意,不应在两个不同的运行之间共享随机对象。在每次运行开始时,您应该创建一个新的随机对象并记下种子。

但是,如果您需要(出于某种原因)多次运行该算法,并且希望它并行运行(每次独立运行,但一次运行几次),则每次运行需要单独的RNG。但是对于单一的GA,单一的RNG是最好的选择。@Gandalv实际上,这是我应该澄清的。每次运行都应该有自己的新随机对象。如果在两次运行之间共享对象,则它们不再具有确定性。