Bearbeiten: Also im Grunde ist das, was ich zu schreiben versuche, ein 1-Bit-Hash für double
.
Ich möchte eine double
zu true
oder false
mit einer 50/50-Chance zuordnen. Dafür habe ich Code geschrieben, der einige Zufallszahlen auswählt (nur als Beispiel möchte ich dies für Daten mit Regelmäßigkeiten verwenden und trotzdem ein 50/50-Ergebnis erhalten) , ihr letztes Bit überprüft und inkrementiert, y
ob es 1 ist oder n
ob es ist 0.
Dieser Code führt jedoch ständig zu 25% y
und 75% n
. Warum ist es nicht 50/50? Und warum so eine seltsame, aber unkomplizierte (1/3) Verteilung?
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);
}
}
Beispielausgabe:
250167 749833
doubleValue % 1 > 0.5
, aber das wäre zu grobkörnig, da es in einigen Fällen sichtbare Regelmäßigkeiten einführen kann (alle Werte liegen im Bereich der Länge 1). Wenn das zu grobkörnig ist, sollten wir dann wahrscheinlich kleinere Bereiche ausprobieren, wie z doubleValue % 1e-10 > 0.5e-10
. Nun ja. Und nur das letzte Bit als Hash von a zu nehmen, double
passiert, wenn Sie diesem Ansatz bis zum Ende mit dem geringstmöglichen Modulo folgen.
(lastbit & 3) == 0
würde aber funktionieren, seltsam wie es ist.