Выразительный JavaScript (Хавербеке) - страница 43

Слишком большое число глобальных переменных «загрязняет» пространство имён. Чем больше имён занято, тем больше вероятность случайно использовать одно из них в качестве переменной. К примеру, весьма вероятно, что вы захотите использовать имя >max для чего-то в своей программе. Поскольку встроенная в JavaScript функция >max безопасно упакована в объект >Math, нам не нужно волноваться по поводу того, что мы её перезапишем.

Многие языки остановят вас, или хотя бы предупредят, когда вы будете определять переменную с именем, которое уже занято. JavaScript не будет этого делать, поэтому будьте осторожны.

Возвращаясь к объекту >Math, если вам нужна тригонометрия, он вам поможет. У него есть >cos (косинус), >sin (синус), и >tan (тангенс), их обратные функции — >acos, >asin, и >atan. Число π (pi) – или, по крайней мере, его близкая аппроксимация, помещающаяся в число JavaScript – также доступно как >Math.PI. (Есть такая старая традиция в программировании — записывать имена констант в верхнем регистре.)

>function randomPointOnCircle(radius) {

>  var angle = Math.random() * 2 * Math.PI;

>  return {x: radius * Math.cos(angle),

>          y: radius * Math.sin(angle)};

>}

>console.log(randomPointOnCircle(2));

>// → {x: 0.3667, y: 1.966}

Если вы незнакомы с синусами и косинусами – не отчаивайтесь. Мы их будем использовать в 13 главе, и тогда я их объясню.

В предыдущем примере используется >Math.random. Это функция, возвращающая при каждом вызове новое псевдослучайное число между нулём и единицей (включая ноль).

>console.log(Math.random());

>// → 0.36993729369714856

>console.log(Math.random());

>// → 0.727367032552138

>console.log(Math.random());

>// → 0.40180766698904335

Хотя компьютеры – машины детерминированные (они всегда реагируют одинаково на одни и те же входные данные), возможно заставить их выдавать кажущиеся случайными числа. Для этого машина хранит у себя во внутреннем состоянии несколько чисел. Каждый раз, когда идёт запрос на случайное число, она выполняет разные сложные детерминированные вычисления и возвращает часть результата вычислений. Этот результат она использует для того, чтобы изменить своё внутреннее состояние, поэтому следующее «случайное» число получается другим.

Если вам нужно целое случайное число, а не дробь, вы можете использовать >Math.floor (округляет число вниз до ближайшего целого) на результате >Math.random.

>console.log(Math.floor(Math.random() * 10));

>// → 2

Умножая случайное число на 10, получаем число от нуля до 10 (включая ноль). Так как >Math.floor округляет вниз, мы получим число от 0 до 9 включительно.