में क्यों चुना 181783497276652981
और 8682522807148012
चुना गया Random.java
?
यहाँ जावा एसई JDK 1.7 से प्रासंगिक स्रोत कोड है:
/**
* Creates a new random number generator. This constructor sets
* the seed of the random number generator to a value very likely
* to be distinct from any other invocation of this constructor.
*/
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
private static long seedUniquifier() {
// L'Ecuyer, "Tables of Linear Congruential Generators of
// Different Sizes and Good Lattice Structure", 1999
for (;;) {
long current = seedUniquifier.get();
long next = current * 181783497276652981L;
if (seedUniquifier.compareAndSet(current, next))
return next;
}
}
private static final AtomicLong seedUniquifier
= new AtomicLong(8682522807148012L);
इसलिए, new Random()
बिना किसी बीज पैरामीटर के आह्वान करने पर वर्तमान "बीज अद्वितीय" हो जाता है और इसके साथ XORs हो जाता है System.nanoTime()
। फिर इसे 181783497276652981
अगली बार संग्रहीत करने के लिए एक और बीज अद्वितीय बनाने के लिए उपयोग किया new Random()
जाता है।
शाब्दिक 181783497276652981L
और 8682522807148012L
स्थिरांक में नहीं रखे जाते हैं, लेकिन वे कहीं और दिखाई नहीं देते हैं।
पहली बार में टिप्पणी ने मुझे एक आसान नेतृत्व दिया। उस लेख के लिए ऑनलाइन खोज करने से वास्तविक लेख मिलता है । 8682522807148012
कागज में प्रकट नहीं होता है, लेकिन 181783497276652981
प्रकट होता है - एक अन्य संख्या के विकल्प के रूप में 1181783497276652981
, जो 181783497276652981
एक 1
पूर्वनिर्मित के साथ है ।
कागज का दावा है कि 1181783497276652981
एक संख्या है जो एक रैखिक बधाई जनरेटर के लिए अच्छी "योग्यता" पैदा करती है। क्या यह संख्या केवल जावा में गलत कॉपी की गई थी? क्या 181783497276652981
एक स्वीकार्य योग्यता है?
और क्यों 8682522807148012
चुना गया ?
या तो संख्या के लिए ऑनलाइन खोज करने से कोई स्पष्टीकरण नहीं मिलता है, केवल यह पृष्ठ जो 1
सामने गिराए गए को भी नोटिस करता है 181783497276652981
।
क्या अन्य संख्याओं को चुना जा सकता था जो इन दो संख्याओं के साथ-साथ काम करते? क्यों या क्यों नहीं?
8682522807148012
वर्ग के पिछले संस्करण की विरासत है, जैसा कि 2010 में किए गए संशोधनों में देखा जा सकता है । 181783497276652981L
लिखने में कोई त्रुटि वास्तव में हो रहा है और आप एक बग रिपोर्ट फ़ाइल कर सकते हैं।
seedUniquifier
एक 64 कोर बॉक्स पर बेहद संरक्षित हो सकता है। एक थ्रेड-लोकल अधिक स्केलेबल होता।