편집 : 기본적으로 내가 작성하려고하는 것은 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
그래도 이상하게 작동합니다.