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ạ double
tới true
hoặc false
có 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 y
nếu là 1 hoặc n
nếu là 0.
Tuy nhiên, mã này liên tục cho kết quả 25% y
và 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-10
nào? Vâng, vâng. Và chỉ lấy bit cuối cùng làm hàm băm double
là đ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) == 0
sẽ làm việc mặc dù, lẻ như nó là.