সম্পাদনা: সুতরাং মূলত আমি যা লেখার চেষ্টা করছি তা হল 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
যদিও এটি হিসাবে বিজোড় কাজ করবে।