Я говорю о этом удивительно простой реализации rand()
по стандарту C:
static unsigned long int next = 1;
int rand(void) /* RAND_MAX assumed to be 32767. */
{
next = next * 1103515245 + 12345;
return (unsigned)(next/65536) % 32768;
}
Из этой статьи в Википедии мы знаем, что множитель a
(в приведенном выше коде a = 1103515245
) должен удовлетворять только двум условиям:
-
a - 1
делится на все простые множителиm
.
(В нашем случаеm = 2^32
размер int, поэтомуm
имеет только один простой коэффициент = 2) -
a - 1
является кратным 4, еслиm
является кратным 4.
(32768 кратно 4 и 1103515244 тоже)
Почему они выбрали такой странный, трудно запоминающийся "человек, я сыт по горло этими случайными числами, напишу все", например 1103515245?
Возможно, есть некоторые разумные причины, что это число как-то лучше другого?
Например, почему бы не установить a = 20000000001
? Это больше, прохладно и легче запомнить.