Sto parlando di this sorprendentemente semplice implementazione di rand()
dallo standard C:Perché 1103515245 viene utilizzato in 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;
}
Da this Wikipedia article sappiamo che il moltiplicatore a
(nel codice sopra a = 1103515245
) deve soddisfare solo 2 condizioni:
a - 1
è divisibile per tutti i fattori primi dim
.
(nel nostro casom = 2^32
, dimensione del int, quindim
ha un solo fattore primo = 2)a - 1
è un multiplo di 4 sem
è un multiplo di 4.
(32768 è multiplo di 4, e 1103515244 troppo)
Perché hanno scelto come uno strano, difficile da ricordare, "l'uomo, io sono stufo di questi numeri casuali, scrivere qualunque" il numero, come 1.103.515,245 mila?
Forse ci sono alcuni saggi motivi, che questo numero è in qualche modo migliore rispetto agli altri?
Ad esempio, perché non impostare a = 20000000001
? È più grande, dall'aspetto fresco e più facile da ricordare.
@Ed S. : abbastanza ragione per chiedere un numero magico da spiegare ... – gbn
:) Certo che no, ma guarda il numero 12345. Una volta che hanno scelto facile, bello numero 12345, una volta cattivo ... arguzia a un motivo? :) –
Si potrebbe iniziare guardando i riferimenti, le risposte sono probabilmente lì da qualche parte: http://en.wikipedia.org/wiki/Linear_congruential_generator#References –