4 votos

¿Cómo se determina la constante en el RNG xorshift* de Marsaglia?

Consigo el RNG básico de xorshift de Marsaglia. Para mayor aleatoriedad sugiere multiplicar el resultado por una "constante adecuada". Este es un código que he encontrado que hace precisamente eso:

uint64_t s[ 16 ]; 
int p;

uint64_t next(void) { 
    uint64_t s0 = s[ p ];
    uint64_t s1 = s[ p = ( p + 1 ) & 15 ];
    s1 ^= s1 << 31; // a
    s1 ^= s1 >> 11; // b
    s0 ^= s0 >> 30; // c
    return ( s[ p ] = s0 ^ s1 ) * 1181783497276652981LL; 
}

¿De dónde viene el 1181783497276652981LL? Me parece que cualquier número no es una constante adecuada. Si no sirve cualquier número, ¿cómo se determina?

Como siempre, pido disculpas si alguien ha preguntado esto y se ha respondido en otro lugar. He buscado y no he encontrado lo que necesitaba.

4voto

Phil Cloarec Puntos 11

Ese es mi código :). El enlace de arriba explica por qué elegí esa constante, pero, básicamente, es una constante que produce un buen generador congruente multiplicativo. Como tal, se espera que revuelva de forma agradable los bits del número por el que se multiplica. Esto es sólo una heurística tomada de "Recetas Numéricas". El documento tiene más detalles.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X