8.1 Псевдослучайные числа
Иногда программист сталкивается с простыми, казалось бы, задачами: «отобрать случайный фильм для вечернего просмотра из определенного списка», «выбрать победителя лотереи», «перемешать список песен при тряске смартфона», «выбрать случайное число для шифрования сообщения», и каждый раз у него возникает очень закономерный вопрос: а как получить это самое случайное число?
Вообще-то, если вам нужно получить «настоящее случайное число», сделать это довольно-таки трудно. Вплоть до того, что в компьютер встраивают специальные математические сопроцессоры, которые умеют генерировать такие числа, с выполнением всех требований к «истинной случайности».
Поэтому программисты придумали свое решение — псевдослучайные числа. Псевдослучайные числа — это некая последовательность, числа в которой на первый взгляд кажутся случайными, но специалист при детальном анализе сможет найти в них определенные закономерности. Для шифрования секретных документов такие числа не подойдут, а для имитации бросания кубика в игре — вполне.
Есть много алгоритмов генерации последовательности псевдослучайных чисел и почти все из них генерируют следующее случайное число на основе предыдущего и еще каких-то вспомогательных чисел.
Например, данная программа выведет на экран 1000 неповторяющихся чисел:
let a = 41;
let c = 11119;
let m = 11113;
let seed = 1;
function getNextRandom() {
seed = (a * seed + c) % m;
return seed;
}
for (let t = 0; t < 1000; t++) {
let x = getNextRandom();
console.log(x);
}
Кстати, мы говорим не о псевдослучайных числах, а именно о последовательности таких чисел, т. к. глядя на одно число невозможно понять, случайное оно или нет.
Случайное число ведь можно получить разными способами:
function getNextRandom() {
return 4; # это точно случайное число (я выкинул его с помощью кубиков)
}
8.2 Оператор switch
Оператор switch используется для выполнения одного из нескольких блоков кода в зависимости от значения выражения. Он особенно полезен, когда необходимо сравнить одно значение с несколькими возможными вариантами.
Синтаксис:
switch(expression) {
case value1:
// код, который выполнится, если expression === value1
break;
case value2:
// код, который выполнится, если expression === value2
break;
// ...
default:
// код, который выполнится, если ни одно из значений не совпало
}
Пример:
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "Понедельник";
break;
case 2:
dayName = "Вторник";
break;
case 3:
dayName = "Среда";
break;
case 4:
dayName = "Четверг";
break;
case 5:
dayName = "Пятница";
break;
case 6:
dayName = "Суббота";
break;
case 7:
dayName = "Воскресенье";
break;
default:
dayName = "Неверный день";
}
console.log(dayName); // "Среда"
8.3 Оператор ??
Оператор ??, или nullish coalescing operator, используется для назначения значения по умолчанию, если левый операнд является null или undefined. Он позволяет избежать применения значения по умолчанию для других ложных значений, таких как 0, false, или пустая строка ("").
Синтаксис:
let result = value1 ?? value2;
Если value1 не null или undefined, result будет value1. В противном случае result будет value2.
Примеры:
let foo = null ?? 'default';
console.log(foo); // 'default'
let bar = 0 ?? 'default';
console.log(bar); // 0 (0 не является null или undefined)
let baz = undefined ?? 'default';
console.log(baz); // 'default'
Отличие от логического ИЛИ (||)
Оператор || также может использоваться для задания значения по умолчанию, но он возвращает правый операнд для любых ложных значений, таких как 0, "", или NaN.
Пример сравнения:
let value = 0 || 'default';
console.log(value); // 'default' (поскольку 0 - ложное значение)
let value2 = 0 ?? 'default';
console.log(value2); // 0 (поскольку 0 не является null или undefined)
Применение
Оператор ?? полезен в ситуациях, когда необходимо задать значение по умолчанию только для null или undefined, но сохранить ложные значения, такие как 0 или "".
Реальные примеры использования
Пример 1. Значения по умолчанию в объектах конфигурации:
function configure(settings) {
settings = settings ?? {};
let timeout = settings.timeout ?? 1000;
let color = settings.color ?? 'blue';
// остальная логика настройки
}
Пример 2. Параметры по умолчанию для функций:
function printMessage(message) {
message = message ?? 'No message provided';
console.log(message);
}
printMessage(null); // 'No message provided'
printMessage('Hello'); // 'Hello'
Использование оператора ?? позволяет писать более чистый и предсказуемый код, особенно в ситуациях, когда важно учитывать только отсутствие значения (null или undefined).
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ