aleks-th, хранить длину каждого слова крайне затратно. Проще создать штук 100 индексов, которые будут указывать на некоторые слова по всему файлу, т.е. будут хранить позицию (смещение) слова, а не размер.
Рандом, конечно же, не совсем честный и сильно зависит от различия в длинах строк в файле.
В виду того, что файл очень большой, различия в длинах строк становятся очень несущественными для такого рандома. Так что твой вариант идеально подойдёт для моей задачи.
Кое-что забыл написать в своём ответе.
Обрати внимание на то, что я не принтю результат прямо в функции count_letters. Функция лишь возвращает вычисленный результат. Это называется чистая функция. Одно из важных понятий чистого кода.
Noder SS, в качестве БД для хранения страниц можешь использовать SQLite. Его устанавливать не надо, это будет обычный файл. Надо только установить модуль: npm install sqlite3