0

我目前正在研究 Java 中的遗传编程算法。对于我的实验,我尝试了几种设置组合并了解所需的时间,我多次运行每个设置组合,以便我可以取平均值等。

但是,即使有时我只启动一个具有恒定值的 Random rng 实例作为种子(不幸的是,并非总是如此),但对于使用相同设置的运行,我会得到不同的结果。

所以,我的问题是,除了在我自己的代码中显式创建新的随机数生成器之外,其他随机性来源可能是什么?

会不会是集合、散列等工作的方式???我怎样才能使这些工作可预测?

我已经检查了对 Collections.shuffle 的调用,并用我的单个 Random 实例将它们作为种子......

任何建议都非常感谢。

一些评论建议发布代码。但是,我不是在寻求具体的反馈,但我更感兴趣的是一般来说(不希望的)随机性来源可能是什么。我忘了提到的一个当然是使用多线程。

当然,我强制让我的代码运行单线程,以防止来自该源的任何随机性

4

2 回答 2

2

一旦你消除了随机和多线程作为非确定性的来源,接下来要看的地方是忘记在集合中使用的某些对象上实现 hashCode() 和 equals()。我从不将 Random 用于任何事情,但我有许多非确定性程序,其恶意行为可以追溯到 Object.hashCode()。

于 2012-06-25T03:17:15.743 回答
1

使用 java.util.Random 生成的随机数序列保证对于用于初始化它的任何特定种子都是相同的。从API 文档

如果使用相同的种子创建 Random 的两个实例,并且为每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。

所以简短的回答是,只有当您更改对 RNG 进行的方法调用的数量或顺序时,才会发生这种情况。正如评论中提到的,最可能的解释是您有多个线程使用 RNG。在这种情况下,非确定性 OS 调度显然有可能导致调用顺序因运行而异。

即使在单线程应用程序中,也可能发生这种情况的另一种方式是,如果您的应用程序直接或间接地使用来自任何未严格排序的事件处理程序的 RNG。例如,如果您(或您使用的库)Random从事件处理程序中使用鼠标、键盘或网络事件,则处理这些事件的不确定顺序可能会改变由其他主线代码生成的数字序列。

于 2012-06-25T02:00:49.840 回答