Chỉnh sửa: Vì vậy, về cơ bản những gì tôi đang cố gắng viết là hàm băm 1 bit double.
Tôi muốn ánh xạ doubletới truehoặc falsecó cơ hội 50/50. Vì tôi đã viết mã chọn một số số ngẫu nhiên (như một ví dụ, tôi muốn sử dụng mã này trên dữ liệu một cách đều đặn và vẫn nhận được kết quả 50/50) , kiểm tra bit cuối cùng của chúng và tăng ynếu là 1 hoặc nnếu là 0.
Tuy nhiên, mã này liên tục cho kết quả 25% yvà 75% n. Tại sao nó không phải là 50/50? Và tại sao một phân phối kỳ lạ, nhưng thẳng (1/3) như vậy?
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);
}
}
Ví dụ đầu ra:
250167 749833
doubleValue % 1 > 0.5, nhưng điều đó sẽ quá thô vì nó có thể đưa ra các quy tắc có thể nhìn thấy trong một số trường hợp (tất cả các giá trị nằm trong phạm vi độ dài 1). Nếu đó là quá thô, thì có lẽ chúng ta nên thử phạm vi nhỏ hơn, như thế doubleValue % 1e-10 > 0.5e-10nào? Vâng, vâng. Và chỉ lấy bit cuối cùng làm hàm băm doublelà điều xảy ra khi bạn làm theo phương pháp này cho đến khi kết thúc, với modulo ít nhất có thể.
(lastbit & 3) == 0sẽ làm việc mặc dù, lẻ như nó là.
