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