Уроки JavaScript – приклади використання випадковості

В JavaScript досить часто потрібно використовувати випадковість або випадкове поводження. Найпростішим прикладом буде отримання випадкового числа для проведення жеребкування. Або, наприклад, уявити можливий результат кидка монети. Але існує багато різних видів випадковості, і для різних додатків потрібно підбирати свій вид випадкового результату.

 

 

Найпростіша випадковість

Найпростішою формою випадковості, яка вбудована в JavaScript, є функція Math.random(). Щоб побачити її в дії, наберіть в консолі браузера (виклик консолі Ctrl+Shift+I) функцію:

Math.random();
//0.2735944957535754 – приклад результату

 

Функція Math.random() завжди повертає число з рухомою комою від 0 до 1.

Примітка: Технічно, число, що повертається Math.random(), може бути 0, але ніколи не буде точно 1.

 

Оскільки ця функція так часто використовується, Math.random() часто поміщається у власну функцію, яку потім викликають в скрипті:

<script>
function getRandom() {
  return Math.random();
}
</script>

 

 

Проблема, звичайно, в тому, що функція завжди створює випадкове число в дуже обмеженому діапазоні; більшість інших прикладів коду в сьогоднішній практичній статті призначені для вирішення цієї проблеми.

 

 

Випадковість між числами: min включено, max виключено

Для цієї функціональності нам буде потрібно трохи математики:

 

З рухомою комою

function getRandomFloat(min, max) {
  return Math.random() * (max - min) + min;
}
getRandomFloat(15, 127);
//61.65118618053822 – приклад результату

 

 

З використанням цілого числа

function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}
getRandomInt(99, 720);
//552 – приклад результату

 

 

 

Випадкове ціле число в діапазоні (включаючи мінімальне та максимальне)

function getRandomInRange(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
getRandomInRange(1, 175);
//73 – приклад результату

 

 

Результат кидка монети (випадкові Правда/Хиба, 1/0)

Якщо ви хочете, щоб результатом був простий випадковий результат, наприклад 0 або 1, що можна представити у вигляді кидка монети, використовуйте наступний рецепт:

function coinToss() {
  return Math.floor(Math.random() * 2);
}
coinToss();
//1 – приклад результату

 

 

Випадковий результат з використанням винятків

Для обмеженого діапазону цілих чисел створіть масив чисел, з яких ви хочете вибирати, і використовуйте наступний рецепт для випадкового вибору з масиву:

<script>
var numPool = [ 2, 3, 5, 8, 11, 25 ],
rand = numPool[Math.floor(Math.random() * numPool.length)];
console.log(rand);
//11 – приклад результату
</script>

 

 

Випадковий, неповторюваний масив

Для невеликого набору чисел створіть масив, заповнений елементами, перемішайте їх випадковим чином, помістіть результати в новий масив, а потім витягніть перемішані елементи по одному:

<script>
var numPool = [ 18, 42, 37, 9, 24, 100 ];
function shuffle(numPool) {
  for(var j, x, i = numPool.length; i; j = parseInt(Math.random() * i), x = numPool[--i], numPool[i] = numPool[j], numPool[j] = x);
  return numPool;
};
var randomResult = shuffle(numPool);
while( randomResult.length > 0 ) {
  console.log( randomResult.pop() );
}
// в результаті вказаний масив буде перемішаний випадковим чином
</script>

 

 

 

Криптографічна випадковість в JavaScript

Жоден з розглянутих методів не створює числа з достатньою випадковістю для використання в криптографічно безпечних функціях. До речі, і результати функції Math.random() не є достатньо випадковими.

Для криптографічної випадковості в JavaScript ми можемо використовувати API веб-криптографії, створивши збірний масив (typedArray):

var cryptoStor = new Uint16Array(5);

 

Тут ми створюємо масив з п’ятьма різними слотами, кожен з яких може містити непідписане (беззнакове) 16-розрядне ціле число. Для інших параметрів цілого числа ви можете використовувати Int8Array, Uint8Array, int16Array, Int32Array і Uint32Array.

 

Після цього ви можете заповнити масив випадковими числами певного типу:

window.crypto.getRandomValues(cryptoStor);

 

В результаті ви отримаєте в консолі такі приблизні значення:

//Uint16Array(5) [23386, 29207, 40761, 23872, 54616] – приклад результату

 

 

API веб-криптографії має хорошу підтримку в сучасних браузерах, хоча в деяких випадках потрібне використання префікса постачальника.

На сьогодні все, дякуємо за увагу!

 

Recent Posts

Чому обрати освіту за кордоном: переваги для майбутнього вашої дитини

Навчання за кордоном вже давно асоціюється з якісною освітою, новими можливостями та безліччю перспектив. Але…

18 години ago

Як вибрати майстра для перетяжки меблів?

Вибір майстра для ремонту та перетяжки меблів – завдання, яке потребує вдумливого підходу. Адже від…

2 дні ago

Що краще вибрати для хостингу: сервер VPS Windows чи VPS Linux?

Вибір ідеального хостингу під свій сайт може бути досить заплутаною справою, особливо коли існує багато…

1 тиждень ago

Лоуренс Пітер

Щоб уникати помилок, потрібно набиратися досвіду; щоб набиратися досвіду, потрібно робити помилки Лоуренс Пітер  

2 тижні ago

Що таке Чорне СЕО (Black Hat SEO) — вся потрібна інформація

Коротке визначення Чорного SEO Чорне СЕО (або Чорна оптимізація) — це будь-яка практика, метою якої…

2 тижні ago

Права категорії C: кому вони потрібні та як їх отримати?

Отримання прав водія категорії C відкриває двері до професійної діяльності, пов'язаної з керуванням вантажними автомобілями.…

3 тижні ago