Math.random: примеры (JAVASCRIPT)

Генерация случайных чисел в JavaScript с Math.random
Раздел: Математика, Случайные числа
Math.random(none): number

Основы функции Math.random

Метод Math.random() является статическим методом объекта Math в JavaScript. Он применяется для генерации псевдослучайного числа с плавающей запятой в диапазоне от 0 (включительно) до 1 (исключительно).

Когда используется:

  • Моделирование случайных событий в играх.
  • Выбор случайного элемента из массива.
  • Созранение тестовых данных.
  • Генерация уникальных идентификаторов (в сочетании с другими методами).

Функция не принимает аргументов. Она всегда возвращает число в диапазоне [0, 1). Алгоритм генерации использует детерминированный псевдослучайный алгоритм, инициализируемый системным временем или другим источником энтропии.

Простые примеры использования

Базовый вызов:

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

Генерация числа от 0 до N (не включая N):

function getRandom(max) {
  return Math.random() * max;
}
console.log(getRandom(10));
7.392781456912345

Целое число от min до max (включительно):

function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(getRandomInt(1, 6));
4

Альтернативы в JavaScript

Crypto.getRandomValues()

Метод crypto.getRandomValues() предоставляет криптографически стойкие случайные значения. Он предпочтителен для задач безопасности, таких как генерация ключей или токенов.

const array = new Uint32Array(1);
window.crypto.getRandomValues(array);
console.log(array[0]);
3548123456

Сторонние библиотеки

Библиотеки, например, seedrandom, позволяют использовать воспроизводимые последовательности случайных чисел с заданным сидом, что полезно для тестирования.

Аналоги в других языках

Python (random.random):

import random
print(random.random())
0.54898123

PHP (rand, mt_rand, random_int):

echo rand(0, getrandmax()) / getrandmax(); // Аналог [0,1)
echo mt_rand(1, 10); // Целое число
echo random_int(1, 100); // Криптографически стойкое
0.423...
7
42

MySQL (RAND):

SELECT RAND();
0.654321

C (rand из stdlib.h):

#include 
#include 
int main() {
    srand(time(NULL));
    printf("%f\n", rand() / (RAND_MAX + 1.0));
    return 0;
}
0.123456

Основное отличие JavaScript - отсутствие встроенной поддержки сидирования через аргументы, как в Python или C.

Типичные ошибки

1. Неправильное масштабирование для целых чисел.

// Ошибка: не включает max
function wrongInt(max) {
  return Math.floor(Math.random() * max); // max никогда не выпадет
}
console.log(wrongInt(5)); // Возможные значения: 0,1,2,3,4
3

2. Забывание инициализации сида в циклах или анимациях.

// При быстрых последовательных вызовах результаты могут быть похожи
for(let i = 0; i < 3; i++) console.log(Math.random());
0.123
0.124
0.125

3. Использование для криптографических целей.

Math.random не является криптографически стойким. Для паролей или токенов необходим crypto.getRandomValues.

История изменений

Алгоритм реализации Math.random() менялся в разных движках JavaScript. Например, до 2015 года V8 (движок Chrome) использовал алгоритм MWC1616. Сейчас большинство движков используют алгоритм xorshift128+ или его вариации, которые обеспечивают лучшую статистическую случайность и производительность.

Спецификация ECMAScript не определяет конкретный алгоритм, требуя только возврат числа в диапазоне [0, 1). Поэтому точное поведение и качество случайности могут различаться между браузерами и версиями, хотя различия обычно незначительны для большинства приложений.

Расширенные примеры

1. Генерация случайного HEX-цвета.

Пример javascript
function getRandomColor() {
  return '#' + Math.floor(Math.random() * 16777215).toString(16).padStart(6, '0');
}
console.log(getRandomColor());
#a3f1c2

2. Взвешенный случайный выбор.

Пример javascript
function weightedRandom(weights) {
  let sum = weights.reduce((a, b) => a + b, 0);
  let rand = Math.random() * sum;
  for (let i = 0; i < weights.length; i++) {
    if (rand < weights[i]) return i;
    rand -= weights[i];
  }
}
// Веса: [1, 3, 6] - третий элемент выпадает в 6 раз чаще первого
console.log(['Малый', 'Средний', 'Большой'][weightedRandom([1, 3, 6])]);
Большой

3. Генерация строки заданной длины.

Пример javascript
function randomString(length) {
  let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
}
console.log(randomString(8));
xY7gHk2Q

4. Перемешивание массива (алгоритм Фишера-Йетса).

Пример javascript
function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}
console.log(shuffleArray([1, 2, 3, 4, 5]));
[3, 5, 1, 4, 2]

5. Создание случайной точки на окружности.

Пример javascript
function randomPointOnCircle(radius) {
  let angle = Math.random() * 2 * Math.PI;
  return {
    x: radius * Math.cos(angle),
    y: radius * Math.sin(angle)
  };
}
console.log(randomPointOnCircle(10));
{ x: 7.071..., y: 7.071... }

JS Math.random function comments

En
Math.random Returns a random number between 0 and 1