Я говорю о этом удивительно простой реализации 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? Это больше, прохладно и легче запомнить.