如何在Java程序中发现并消除随机性源

如何在Java程序中发现并消除随机性源,java,random,Java,Random,我目前正在用Java开发一种遗传编程算法。 在我的实验中,我尝试了几种设置组合,为了得到所需时间的概念,我将每种设置组合运行了几次,以便取平均值等 然而,即使我只是以一个常量值作为种子启动一个随机rng实例,有时(不幸的是,并非总是如此),对于使用相同设置的运行,我会得到不同的结果 那么,我的问题是,除了在我自己的代码中显式创建新的随机数生成器之外,还有什么其他的随机性来源呢 这会不会妨碍集合、散列等的工作???我怎样才能使这些工作可以预测 我已经检查了对Collections.shuffle的

我目前正在用Java开发一种遗传编程算法。 在我的实验中,我尝试了几种设置组合,为了得到所需时间的概念,我将每种设置组合运行了几次,以便取平均值等

然而,即使我只是以一个常量值作为种子启动一个随机rng实例,有时(不幸的是,并非总是如此),对于使用相同设置的运行,我会得到不同的结果

那么,我的问题是,除了在我自己的代码中显式创建新的随机数生成器之外,还有什么其他的随机性来源呢

这会不会妨碍集合、散列等的工作???我怎样才能使这些工作可以预测

我已经检查了对Collections.shuffle的调用,并让它们与我的单个随机实例一起播种

任何建议都将不胜感激

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


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

使用java.util.random生成的随机数序列对于用于初始化它的任何特定种子都是相同的。发件人:

如果使用同一种子创建了两个Random实例,则 对每个方法调用的顺序相同,它们将生成 返回相同的数字序列

因此,简单的回答是,只有在更改针对RNG的方法调用的数量或顺序时,才会发生这种情况。注释中提到的最可能的解释是,您有多个线程使用RNG。在这种情况下,显然不确定的操作系统调度可能会导致调用顺序在不同的运行中有所不同


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

使用java.util.random生成的随机数字序列保证与用于初始化它的任何特定种子相同。发件人:

如果使用同一种子创建了两个Random实例,则 对每个方法调用的顺序相同,它们将生成 返回相同的数字序列

因此,简单的回答是,只有在更改针对RNG的方法调用的数量或顺序时,才会发生这种情况。注释中提到的最可能的解释是,您有多个线程使用RNG。在这种情况下,显然不确定的操作系统调度可能会导致调用顺序在不同的运行中有所不同


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

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

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

如果有多个线程,它们提取随机数的顺序在运行之间可能会有所不同。您必须在不检查代码的情况下显示一些代码,我们所能推测的是,您的程序并行运行,并且线程在每次运行时都以不同的顺序工作。发布一些代码。re:那么你的实现是多线程的吗?因为这是随机性的来源。如果您在多机环境中运行,不同的机器/操作系统可能会产生不同的随机数流。但是我的钱在多线程的建议上。如果你有多个线程,它们提取随机数的顺序在运行之间可能会有所不同。你必须在不检查代码的情况下显示一些代码,我们可以推测的是,你的程序是并行运行的,并且线程在每次运行时都以不同的顺序工作。发布一些代码。re:那么你的实现是多线程的吗?因为这是随机性的来源。如果您在多机环境中运行,不同的机器/操作系统可能会产生不同的随机数流。但是我的钱在多线程的建议上。所以随机性有两个原因:使用来自不同来源/不同种子的随机数生成器和多线程?像集合、散列码(不应该)等不应该是另一个原因?@JoosBuijs我不确定你所说的“使用来自不同来源的随机数生成器”是什么意思,但你所说的要点是正确的——使用集合、散列码等。,不应在java.util.Random Random number generator生成的数字序列中引入任何随机性(即使