2015-12-22 23 views
5

私は良い擬似乱数ジェネレータ(PRNG)が必要ですが、現在の技術水準はxorshift128 +アルゴリズムのようです。残念ながら、私は2つの異なるバージョンを発見しました。ウィキペディアで1:として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; 
} 

まっすぐ前方に十分なようです。さらに、編集ログには、「Vigna」という名前のユーザー(このコードスニペットはxorshift128 +:Further scramblings of Marsaglia’s xorshift generatorsの論文の著者である「Sebastiano Vigna」)によって追加されたことが示されています。残念ながら、その論文の実装は若干異なります。

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; 
} 

は別に、いくつかの異なった名前から、これら二つのスニペットが最後の二つのシフトを除いて同一です。 Wikipediaのバージョンでは、これらのシフトは17と26で、紙のシフトは18と5である。

"正しい"アルゴリズムは誰にも分かりますか?違いはありますか?これは明らかに広く使用されているアルゴリズムですが、どのバージョンが使用されていますか?

+0

[このセバスヴィーニャパブリックコメント](http://v8project.blogspot.com/2015/12/theres-mathrandom-and-then- theres.html?showComment = 1450389868643#c2004131565745698275)を参照してください。両方のアルゴリズムが「正しい」場合は、著者に連絡して、彼に希望のバージョンがあるかどうか尋ねることができます。 – Blastfurnace

+0

@blastfurnace - ありがとう、私は必要なもののように見える。 –

+0

@Blastfurnace:このコメントは、主に理論的だと言っていますが、彼の好みをかなり明確にするようです。 –

答えて

3

@Blastfurnaceのおかげで、アルゴリズムの著者による最新の定数セットは、23,18、および5です。明らかにそれほど重要ではありませんが、理論的に彼が使用した最初の数よりも優れています。 Sebastiano Vignaは、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; 
関連する問題