2015-12-22 9 views
5

मुझे एक अच्छा छद्म यादृच्छिक संख्या जनरेटर (पीआरएनजी) की आवश्यकता है, और ऐसा लगता है कि कला की वर्तमान स्थिति xorshift128 + algoritm है। दुर्भाग्य से, मैंने 2 अलग-अलग संस्करणों की खोज की है। विकिपीडिया पर एक के रूप Xorshift शो:xorshift128 + एल्गोरिदम की वास्तविक परिभाषा क्या है?

uint64_t s[2]; 

uint64_t xorshift128plus(void) { 
    uint64_t x = s[0]; 
    uint64_t const y = s[1]; 
    s[0] = y; 
    x ^= x << 23; // a 
    s[1] = x^y^(x >> 17)^(y >> 26); // b, c 
    return s[1] + y; 
} 

सीधे आगे पर्याप्त लगता है कौन सा। और भी, संपादन लॉग यह दिखाने के लिए प्रकट होते हैं कि इस कोड स्निपेट को "विग्ना" नामक उपयोगकर्ता द्वारा जोड़ा गया था, जो संभवतः "सेबास्टियानो विग्ना" है जो xorshift128 +: Further scramblings of Marsaglia’s xorshift generators पर पेपर का लेखक है। दुर्भाग्य से, कि समाचार पत्र में कार्यान्वयन थोड़ा अलग है: कुछ अलग-अलग नामों से

uint64_t next(void) { 
    uint64_t s1 = s[0]; 
    const uint64_t s0 = s[1]; 
    s[0] = s0; 
    s1 ^= s1 << 23; // a 
    s[1] = s1^s0^(s1 >> 18)^(s0 >> 5); // b, c 
    return s[1] + s0; 
} 

अलावा, इन दोनों के टुकड़े अंतिम दो पालियों को छोड़ कर एक कर रहे हैं। विकिपीडिया संस्करण में उन बदलावों को 17 और 26 तक किया गया है, जबकि पेपर में बदलाव 18 और 5 के बीच हैं।

क्या किसी को पता है कि "सही" एल्गोरिदम कौन सा है? क्या इससे कोई फर्क पड़ता है? यह स्पष्ट रूप से काफी व्यापक रूप से उपयोग किया जाने वाला एल्गोरिदम है - लेकिन किस संस्करण का उपयोग किया जाता है?

+0

मैंने पाया [इस Sebastiano विग्ना सार्वजनिक टिप्पणी] (http://v8project.blogspot.com/2015/12/theres-mathrandom-and-then- theres.html? showComment = 1450389868643 # c2004131565745698275) जो विभिन्न निरंतर मानों का संदर्भ देता है। दोनों एल्गोरिदम "दाएं" हैं, आप यह पूछने के लिए लेखक से संपर्क कर सकते हैं कि उनके पास पसंदीदा संस्करण है या नहीं। – Blastfurnace

+0

@blastfurnace - धन्यवाद, ऐसा लगता है कि मुझे क्या चाहिए। –

+0

@ ब्लास्टफर्नस: टिप्पणी (मुझे मेरे लिए) अपनी प्राथमिकता को स्पष्ट करने के लिए प्रतीत होती है, भले ही वह कहता है कि यह ज्यादातर सैद्धांतिक है। –

उत्तर

3

@ ब्लास्टफर्नस के लिए धन्यवाद, ऐसा लगता है कि उत्तर यह है कि एल्गोरिदम के लेखक के अनुसार स्थिरांक का सबसे हालिया सेट है: 23, 18, और 5. जाहिर है, इससे कोई फर्क नहीं पड़ता है, लेकिन वे हैं उन्होंने उपयोग किए गए संख्याओं के प्रारंभिक सेट से सैद्धांतिक रूप से बेहतर। सेबस्टियानो विग्ना ने news that the V8 Javascript engine के जवाब में इन टिप्पणियों को इस एल्गोरिदम का उपयोग करने के लिए स्थानांतरित कर दिया है।

कार्यान्वयन है कि मैं का उपयोग कर रहा है:

uint64_t a = s[0]; 
uint64_t b = s[1]; 

s[0] = b; 
a ^= a << 23; 
a ^= a >> 18; 
a ^= b; 
a ^= b >> 5; 
s[1] = a; 

return a + b; 
संबंधित मुद्दे