Числа получаю из символов sha256(microtime())
Не знаю, ни что такое "ша", ни тем более что такое "микротайм" (пардон, правильно "майкротиме", конечно). Но, судя по всему, эта процедура тупо запрашивает состояние системных часов, оставляя лишь младшие разряды, причём делает это часто. Ну тогда ничего удивительного: на начальном участке накапливается некоторая значительная сумма, добавки к которым после многих тысяч циклов (никак не синхронизированных с циклом собственно запросов) затем нивелируются.
хеш-функция.
В данном случае получает системное время и преобразует его в нечто вроде
7BB9466B20DC4A63FD2A14DFE6B3A36A348DFAA5F05BA46683A5607011746E39
которе затем преобразовываю в числа 0-14.
Раньше перекосов не замечалось )))
И таки придётся что-то другое использовать значит.