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.