Math.random: примеры (JAVASCRIPT)
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,43
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-цвета.
function getRandomColor() {
return '#' + Math.floor(Math.random() * 16777215).toString(16).padStart(6, '0');
}
console.log(getRandomColor());#a3f1c2
2. Взвешенный случайный выбор.
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. Генерация строки заданной длины.
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. Перемешивание массива (алгоритм Фишера-Йетса).
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. Создание случайной точки на окружности.
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... }