संपादित करें: तो मूल रूप से जो मैं लिखने की कोशिश कर रहा हूं वह 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
हालांकि, यह काम अजीब होगा।