編集:基本的に私が書こうとしているのはの1ビットのハッシュですdouble。
私はマッピングするdoubleにtrueまたはfalse50/50チャンスと。そのために、いくつかの乱数を選択するコードを書きました(例として、規則性のあるデータでこれを使用し、それでも50/50の結果を取得したい)、最後のビットをチェックし、y1であるか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
doubleValue % 1 > 0.5こともできますが、場合によっては目に見える規則性をもたらす可能性があるため、粒度が粗すぎます(すべての値が長さ1の範囲内にあります)。それが粗すぎる場合は、おそらく次のように範囲を狭めてみるべきでしょうdoubleValue % 1e-10 > 0.5e-10か?はい、そうです。そして、最後のビットだけをaのハッシュとしてとるdoubleことは、このアプローチを最後までたどると、可能な限り最小のモジュロで行われることになります。
(lastbit & 3) == 0しかし、奇妙なことに、うまくいきます。
