Проблема в том, что mt_rand(0, strlen($characters))
будет генерировать числа вплоть до длины строки, но поскольку смещения строк начинаются с 0, максимальное смещение равно длине минус один.Поэтому правильным будет mt_rand(0, strlen($characters) - 1)
.
Кстати, я бы рекомендовал использовать массив символов, сгенерированный range('a', 'z')
(чтобы вам не пришлось его печатать), и получить элемент, используя array_rand
.