2015-12-22 5 views
5

Ho bisogno di un buon generatore di numeri pseudo casuali (PRNG), e sembra che lo stato attuale dell'arte sia l'algoritmo xorshift128 +. Sfortunatamente, ho scoperto 2 versioni differenti. Quello su wikipedia: Xorshift spettacoli come:Qual è la vera definizione dell'algoritmo 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; 
} 

Quale sembra dritto abbastanza avanti. Inoltre, i registri di modifica sembrano mostrare che questo snippet di codice è stato aggiunto da un utente chiamato "Vigna", che è presumibilmente "Sebastiano Vigna" che è l'autore del documento su xorshift128 +: Further scramblings of Marsaglia’s xorshift generators. Sfortunatamente, l'implementazione in quanto la carta è leggermente diversa:

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

parte alcuni nomi diversi, questi due frammenti sono identici eccetto per gli ultimi due turni. Nella versione di Wikipedia questi turni sono di 17 e 26, mentre i turni nella carta sono di 18 e 5.

Qualcuno sa qual è l'algoritmo "giusto"? Fa la differenza? Questo è apparentemente un algoritmo largamente usato - ma quale versione è usata?

+0

ho trovato [questo commento pubblico Sebastiano Vigna] (http://v8project.blogspot.com/2015/12/theres-mathrandom-and-then- theres.html? showComment = 1450389868643 # c2004131565745698275) che fa riferimento ai diversi valori costanti. Entrambi gli algoritmi sono "giusti", puoi contattare l'autore per chiedere se ha una versione preferita. – Blastfurnace

+0

@blastfurnace - grazie, sembra quello di cui ho bisogno. –

+0

@Blastfurnace: Il commento sembra (per me) rendere abbastanza chiara la sua preferenza, anche se dice che è per lo più teorico. –

risposta

3

Grazie a @Blastfurnace, sembra che la risposta sia che l'insieme più recente di costanti secondo l'autore dell'algoritmo sono: 23, 18 e 5. Apparentemente non importa troppo, ma quelli sono teoricamente migliore della serie iniziale di numeri che ha usato. Sebastiano Vigna ha fatto questi commenti in risposta allo news that the V8 Javascript engine che sta passando all'utilizzo di questo algoritmo.

L'applicazione che sto usando è:

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;