संपादित करें: तो मूल रूप से जो मैं लिखने की कोशिश कर रहा हूं वह 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? सही है। और doubleकम से कम अंतिम मोडुलो के साथ जब तक आप इस दृष्टिकोण का पालन करते हैं, तब तक अंतिम बिट के रूप में होता है।
(lastbit & 3) == 0हालांकि, यह काम अजीब होगा।
