为什么使用相同种子创建的两个 Random 对象从 hashcode() 产生不同的结果
Why do two Random objects created with the same seed produce different results from hashcode()
我有一个包含 Random
对象的 class。我使用 Random
对象作为重载 hashCode()
和 equals(Object o)
方法的一部分。我发现使用相同种子创建的两个 java.util.Random
对象不会产生相同的哈希码,也不等于 return 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 类型的对象不相等?
java.util.Random
class 不会覆盖 equals()
和 hashCode()
方法,因此会调用 Object
class 中的哈希码,返回对象在内存中的地址。所以 2 个不同的 Random 对象有 2 个不同的哈希码,因为它们实际上是不同的对象。
您似乎混淆了 Random
对象和结果。 Random
对象是一个随机数生成器,而不是一个随机数。比较它们没有意义。无论您尝试做什么,都应该以不同的方式完成。
我有一个包含 Random
对象的 class。我使用 Random
对象作为重载 hashCode()
和 equals(Object o)
方法的一部分。我发现使用相同种子创建的两个 java.util.Random
对象不会产生相同的哈希码,也不等于 return 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 类型的对象不相等?
java.util.Random
class 不会覆盖 equals()
和 hashCode()
方法,因此会调用 Object
class 中的哈希码,返回对象在内存中的地址。所以 2 个不同的 Random 对象有 2 个不同的哈希码,因为它们实际上是不同的对象。
您似乎混淆了 Random
对象和结果。 Random
对象是一个随机数生成器,而不是一个随机数。比较它们没有意义。无论您尝试做什么,都应该以不同的方式完成。