【发布时间】:2015-02-21 21:43:44
【问题描述】:
编辑:所以基本上我要写的是double 的 1 位哈希。
我想以 50/50 的几率将 double 映射到 true 或 false。为此,我编写了选择一些随机数的代码(仅作为示例,我想在有规律的数据上使用它并且仍然得到 50/50 的结果),检查它们的最后一位并递增 @987654325 @如果是1,n如果是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
【问题讨论】:
-
我真的希望答案是关于浮点变量的随机生成,而不是“LCG 在低位具有低熵”。
-
我很好奇,“双倍的 1 位哈希”的目的是什么?我真的想不出这种要求的任何合法应用。
-
@corsiKa 在几何计算中,我们经常要从两个可能的答案中选择两种情况(例如指向线的左侧还是右侧?),有时它会引入第三种,退化的情况(点就在线上),但你只有两个可用的答案,所以在这种情况下你必须伪随机地选择一个可用的答案。我能想到的最好方法是对给定的双精度值之一进行 1 位哈希(请记住,这些是几何计算,所以到处都有双精度值)。
-
@corsiKa (因为太长,评论分成两部分)我们可以从
doubleValue % 1 > 0.5这样更简单的东西开始,但这会过于粗略,因为它在某些情况下会引入可见的规律性(所有值都在长度 1) 的范围内。如果这太粗粒度,那么我们是否应该尝试更小的范围,比如doubleValue % 1e-10 > 0.5e-10?嗯,是。并且仅将最后一位作为double的哈希值是当您遵循这种方法直到最后时会发生的情况,并且模数尽可能少。 -
@kmote 那么你仍然有严重偏向的最低有效位,而另一位不能补偿它 - 事实上它也偏向零(但更少),确切地说同样的原因。所以分布将是大约 50、12.5、25、12.5。
(lastbit & 3) == 0会起作用,虽然很奇怪。
标签: java random double bit-manipulation probability