Math.random()

Время чтения: меньше 5 мин

Кратко

Секция статьи "Кратко"

Одна из самых часто используемых функции объекта Math. Возвращает случайное число в диапазоне от 0 до 1, не включая 1.

Как пишется

Секция статьи "Как пишется"
        
          
          let value = Math.random()console.log(value) // выведет случайное число
          let value = Math.random()

console.log(value) // выведет случайное число

        
        
          
        
      
Открыть демо в новой вкладке

Детали реализации

Секция статьи "Детали реализации"

Давайте заглянем под капот Math.random(), и узнаем, как же в действительности происходит формирование случайного числа.

На самом деле, функция не генерирует случайное число. Это лишь иллюзия. За генерацию подобных чисел отвечают специальные алгоритмы, которые относятся к категории PRNG — pseudorandom number generator, их также называют генераторами псевдослучайных чисел.

Генератор псевдослучайных чисел (ГПСЧ) — метод генерации чисел арифметическим способом.

Любой PRNG-алгоритм генерирует числа, которые, в конечном счёте, будут повторяться. Поэтому числа, генерируемые Math.random(), можно предугадать.

Но какой алгоритм используется для нашей функции, их же много?

Разработчики браузерных движков сами определяют, какой алгоритм будет применяться в их среде. Но начиная с 2015 года, большинством используется xorshift128+. В этот список входят: Firefox, Safari и браузеры, использующие движок V8 (Chromium-подобные браузеры).

На практике

Секция статьи "На практике"

nlopin

Секция статьи "nlopin"

🛠 Не используй генерацию числа в критичных местах, например для ключа доступа — для этого лучше использовать Web Cryptography API. Он работает медленнее, но криптографически устойчив:

        
          
          window.crypto.getRandomValues(new Uint32Array(1))[0]//  вернет случайное число от 0 до 2^32
          window.crypto.getRandomValues(new Uint32Array(1))[0]
//  вернет случайное число от 0 до 2^32

        
        
          
        
      

🛠 Используется, когда нужно сгенерировать случайное число в заданном диапазоне. Функция возвращает число от 0 до 1, но диапазон можно расширить с помощью формулы:

        
          
          Math.floor(Math.random() * (max - min)) + min// от минимума до максимума, не включая максимум
          Math.floor(Math.random() * (max - min)) + min
// от минимума до максимума, не включая максимум

        
        
          
        
      
Открыть демо в новой вкладке

🛠 Используется для выбора случайного элемента из массива. Например, вы хотите отобразить случайный товар дня из списка или же показать пользователю несколько элементов из его коллекции любимых песен.

Открыть демо в новой вкладке