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?
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
@blastfurnace - grazie, sembra quello di cui ho bisogno. –
@Blastfurnace: Il commento sembra (per me) rendere abbastanza chiara la sua preferenza, anche se dice che è per lo più teorico. –