随机性来自哪里?

时间:2010-05-24 11:32:05

标签: java random code-analysis

我正在从事数据挖掘研究项目并使用来自大型svn的代码。

显然,我在svn中使用的一种方法在某处使用随机性而不需要种子,这使得对我的程序的2次调用返回不同的结果。这对我想做的事情很烦人,所以我试图找到那种“不受控制的”随机性。

由于我使用的课程取决于许多其他课程,因此手工操作非常痛苦。知道如何找到随机性的来源吗?

编辑:

粗略地说,我的代码结构为:

- stuff i wrote
- call to a method I didnt write involving lots of others classes
- stuff i wrote

我知道随机性是在我没写的方法中引入的,但无法找到确切位置......

思想:

我正在寻找的可能是一个工具或Eclipse插件,可以让我看到每次在程序执行期间实例化Random。知道这样的事吗?

6 个答案:

答案 0 :(得分:2)

许多随机数生成器的默认种子是当前时间。如果它是一个加密随机数生成器,它就是一个比它复杂得多的种子。

我敢打赌你的随机数可能会被当前时间播种。解决这个问题的唯一方法是找到创建或播种随机数生成器的代码,并将其更改为种子到常量。我不确定Java的语法是什么,但在我的世界(C#)中它是这样的:

Random r = new Random(seedValue);

所以即使有了StackOverflow的答案,你仍然需要做一些侦探工作才能找到你想要的代码。

答案 1 :(得分:1)

也许它有点过时的风格,但是......

如何将中间结果(变量,函数参数)跟踪到标准输出,收集两个不同运行的输入并检查它们在哪里开始不同?

答案 2 :(得分:1)

也许你想读这个:

在Java中,当您创建新的Random对象时,种子会自动设置为系统时钟“当前时间”(以纳秒为单位)。因此,当您查看Random类的源代码时,您将看到一个构造函数,如下所示:

public Random()
{
    this(System.nanoTime());
}

或者也许这样:

在Eclipse中,您可以将光标设置在变量中,然后按 F3 F2 (我完全不知道)。这将使您达到声明此变量的程度。

您可以使用的第二个工具是“查找用法”。然后,您的IDE将搜索方法,变量或变量或任何您想要的所有用法。

答案 3 :(得分:0)

你使用哪个“大svn”?

您可以编写一些简单的测试,以测试对底层函数的两次相同调用是否返回两个相同的结果......

除非你知道Random对象的创建地点,否则你将不得不以这种方式做一些侦探工作。

这段代码中有多少对您开放?

答案 4 :(得分:0)

为什么不插入大量日志记录调用(例如标准错误),以跟踪整个程序中您关注的值的状态。

您可以比较两次连续运行中的跟踪,以通过搜索两个日志文件中的第一个差异来缩小发生随机性的位置。

然后,您可以在该区域中插入更多日志记录调用,直到您准确识别问题为止。

答案 5 :(得分:0)

Java的“Set”类实现并不保证它们以相同的顺序迭代元素。因此,即使您在同一台机器上运行两次程序,遍历集合的顺序也可能会发生变化。除非将所有“set”用法更改为“list”,否则无法对此做任何事情。