Изменить:. Так что в основном то, что я пытаюсь написать, это хэш 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

