Estoy hablando de this sorprendentemente simple aplicación de rand()
de la norma C:¿Por qué se usa 1103515245 en rand?
static unsigned long int next = 1;
int rand(void) /* RAND_MAX assumed to be 32767. */
{
next = next * 1103515245 + 12345;
return (unsigned)(next/65536) % 32768;
}
De this Wikipedia article sabemos que el multiplicador a
(en código a = 1103515245
arriba) debe cumplir con sólo 2 condiciones:
a - 1
es divisible por todos los factores primos dem
.
(En nuestro casom = 2^32
, el tamaño de la int, por lom
tiene sólo un factor primordial = 2)a - 1
es un múltiplo de 4, sim
es un múltiplo de 4.
(32768 es múltiplo de 4, y 1103515244 demasiado)
por qué han elegido como una extraña, y difíciles de recordar, "hombre, yo estoy harto de estos números al azar, escribir lo que sea" número, como 1103515245?
Tal vez hay algunas razones sabias, que este número es de alguna manera mejor que el otro?
Por ejemplo, ¿por qué no establecer a = 20000000001
? Es más grande, atractivo y fácil de recordar.
@Ed S. : pregunta razonable suficiente para pedir que se explique un número mágico ... – gbn
:) Por supuesto que no, pero mira el número 12345. Una vez que eligen el número 12345 fácil y atractivo, alguna vez malo ... ingenio ¿Tienes una razón? :) –
Puedes comenzar mirando las referencias, las respuestas probablemente estén en alguna parte: http://en.wikipedia.org/wiki/Linear_congruential_generator#References –