为什么使用相同种子创建的两个Random对象会产生与hashcode()不同的结果

时间:2015-04-23 15:03:55

标签: java random

我有一个包含Random对象的类。我使用Random对象作为重载hashCode()equals(Object o)方法的一部分。我发现使用相同种子创建的两个java.util.Random对象不会产生相同的哈希码,也不会等于返回true。

public class RandomTest extends TestCase {
    public void testRandom() throws Exception {

        Random r1 = new Random(1);
        Random r2 = new Random(1);


        assertEquals(r1.hashCode(), r2.hashCode()); //nope
        assertEquals(r1, r2); //nope
    }
}

我知道明显的工作是使用种子和nextSomething()进行比较(不完美,但它应该足够好)。所以我的问题是为什么用同一种子和同一次迭代创建的两个Random类型的对象不相等?

2 个答案:

答案 0 :(得分:11)

java.util.Random类不会覆盖equals()hashCode()方法,因此调用Object类的哈希代码,在内存中返回该对象的地址。因此,2个不同的Random对象有2个不同的hashCodes,因为它们实际上是不同的对象。

答案 1 :(得分:0)

您似乎将Random对象与结果混淆。 Random对象是随机数生成器,而不是随机数。比较它们毫无意义。无论你想做什么,都应该以不同的方式完成。