编辑:所以基本上我想写的是1位哈希double
。
我想将映射double
到true
或false
有50/50的机会。为此,我编写了选择一些随机数的代码(仅作为示例,我想在具有规则性的数据上使用它并仍然获得50/50的结果),检查它们的最后一位,并递增y
其是否为1,或者n
是否为1。0。
但是,此代码始终导致25%y
和75%的结果n
。为什么不是50/50?为什么会有这样奇怪但直接的(1/3)分布呢?
public class DoubleToBoolean {
@Test
public void test() {
int y = 0;
int n = 0;
Random r = new Random();
for (int i = 0; i < 1000000; i++) {
double randomValue = r.nextDouble();
long lastBit = Double.doubleToLongBits(randomValue) & 1;
if (lastBit == 1) {
y++;
} else {
n++;
}
}
System.out.println(y + " " + n);
}
}
输出示例:
250167 749833
doubleValue % 1 > 0.5
,但由于它在某些情况下会引入可见的规律性(所有值都在长度1的范围内),因此可能太粗糙了。如果那太粗糙了,那么我们应该尝试较小的范围doubleValue % 1e-10 > 0.5e-10
吗?嗯,是。double
当您采用这种方法直到最后,以最小的模数时,会发生最后的事情作为a的散列的情况。
(lastbit & 3) == 0
虽然可以,但是很奇怪。