Простой ответ на ваш вопрос - это Math.random()
нарушение правила №2.
Во многих других ответах здесь указано, что наличие Math.random()
означает, что эта функция не является чистой. Но думаю стоит сказать, почему Math.random()
портит функции, которые его используют.
Как и все генераторы псевдослучайных чисел, Math.random()
начинается с «начального» значения. Затем он использует это значение в качестве отправной точки для цепочки низкоуровневых манипуляций с битами или других операций, которые приводят к непредсказуемому (но не совсем случайному ) выводу.
В JavaScript задействованный процесс зависит от реализации, и, в отличие от многих других языков, JavaScript не дает возможности выбрать начальное значение :
Реализация выбирает начальное начальное число для алгоритма генерации случайных чисел; он не может быть выбран или сброшен пользователем.
Вот почему эта функция не чистая: JavaScript, по сути, использует неявный параметр функции, который вы не можете контролировать. Он считывает этот параметр из данных, рассчитанных и хранящихся в другом месте, и, следовательно, нарушает правило № 2 в вашем определении.
Если вы хотите сделать эту функцию чистой, вы можете использовать один из альтернативных генераторов случайных чисел, описанных здесь . Назовите этот генератор seedable_random
. Он принимает один параметр (начальное число) и возвращает «случайное» число. Конечно, это число вовсе не случайно; это однозначно определяется семенем. Вот почему это чистая функция. Выходные данные seedable_random
являются «случайными» в том смысле, что прогнозировать выходные данные на основе входных данных затруднительно.
Чистая версия этой функции должна принимать три параметра:
function test(min, max, seed) {
return seedable_random(seed) * (max - min) + min;
}
Для любой данной тройки (min, max, seed)
параметров это всегда будет возвращать один и тот же результат.
Обратите внимание: если вы хотите, чтобы результат seedable_random
был действительно случайным, вам нужно найти способ рандомизировать начальное число! И любая стратегия, которую вы использовали, неизбежно будет нечистой, потому что она потребует от вас сбора информации из источника, не относящегося к вашей функции. Как мне напоминают mtraceur и jpmc26 , сюда входят все физические подходы: аппаратные генераторы случайных чисел , веб-камеры с крышками линз , коллекторы атмосферного шума - даже лавовые лампы . Все это связано с использованием данных, рассчитанных и сохраненных вне функции.
Math.random()
который изменяет состояние ГСЧ.