Якщо ви візьметесь за розробку флеш-гри, то рано чи пізно зіткнетесь з необхідністю використовувати випадкові числа. Відверто кажучи, я не можу уявити жодного ігрового проекту, який би міг існувати без подібного функціоналу. Наприклад, у грі про черепаху випадково генерується розміщення монет та бонусів, випадково визначається кількість “золота”, яка буде отримана при “збиранні” мішечка, випадково вичисляються деякі характеристики “польоту” тощо.
На щастя, у ActionScript 3 існує вбудований метод, який відповідає за генерацію випадкових чисел – Math.random().
Цей метод видає випадкове число від 0 до 1 (якщо бути точним, то від 0 до 0,9999999…) інакше кажучи, метод ніколи не приймає значення 1, хоча максимально наближається до нього.
У документації ActionScript робота цього методу пояснюється наступним чином: Метод Math.random() видає число N, де 0<=N<1.
Яким же чином можна застосувати це на практиці?
По-перше, значення методу Math.random() можна присвоїти якійсь змінній, яку потім використовувати у програмі. Наприклад:
randomNumber = Math.random();
присвоює змінній randomNumber випадкове число від 0 до 1. Це може бути що завгодно, наприклад 0,3609737099283928 чи 0,7299487389629878. Зверніть увагу, що кількість знаків “після коми” не перевищує 16-ти (принцип роботи змінної Number).
Зрозуміла річ, що у “чистому” вигляді метод Math.random() практично не застосовується. Адже навряд чи вам знадобиться число із шістнадцятьма знаками після коми. Втім, після незначної “обробки” можна заставити генератор випадкових чисел працювати саме так, як це буде потрібно розробнику – тобто вам! Для цього у обчислення випадкового числа потрібно додати інший метод, який позбавить нас від дробового остатку.
У класі Math є кілька методів, які дозволяють округлювати числа до цілих значень:
- Math.round – це звичайне округлення. Наприклад результатом методу Math.round(5.4) буде значення 5, а результатом методу Math.round(5.7) буде значення 6. Якщо ви добре пам’ятаєте алгебру, то здогадуєтесь, що значенням методу Math.round(5.5) також буде 6
- Math.floor – округлює до “нижчого значення”. По суті просто відкидає дробову частку. Значенням Math.floor(5.1) як і Math.floor(5.9) буде 5. Легко запам’ятати floor – тобто “підлога” по англійськи. Округлення до нижчого числа
- Math.ceil – за аналогією ceil – від англ. ceiling – стеля. Округлює значення до вищого числа. Math.ceil (5.1) і Math.ceil (5.9) видаватимуть результат 6
Випадкове число 0 або 1
Знаючи принципи роботи методу Math.random та методів округлення, можна перейти до перших конструкцій, які видаватимуть корисний результат, який вже можна застосовувати у програмі. Ось як виглядатиме перша формула, яка видаватиме з однаковою ймовірністю результат 0 або 1:
Math.round(Math.random());
Давайте простежимо, які дії виконує ця функція. Метод Math.random() видає число від 0 до 1 з шістнадцятьма знаками після коми. Метод Math.round() округлює це число до найближчого цілого. Тобто всі числа менші 0,5 округляться до 0, а всі числа, більші 0,5 (включаючи 0,5) округляться до 1. Отже варіантів виконання функції тільки два: 0 або 1. При чому ймовірність того, що результат буде 0 або того, що результат буде 1 – однакова – 50%.
Цю функцію вже можна використовувати в програмі, коли нам потрібно створити подію із 50% шансом на виконання. Наприклад, якщо ми хочемо зробити імітацію монетки, шанс випадання “орла” та “решки” якої буде однаковим.
Нижче наведена проста програма, в якій використовується описана функція. Результат буде 0 або 1 (ймовірність випадання кожного числа – 50%). Клікайте по кнопці generate.
Випадковий результат від 1 до 100 (будь-якого заданого числа)
Для того, щоб отримати будь-яке число від 1 до 100, потрібно помножити результат методу Math.random на 100. Таким чином результатом функції стане будь-яке число від 0 до 100. Втім, нам потрібно, щоб мінімальним результатом була одиниця. Щоб все працювало правильно, потрібно зважити на деякі особливості роботи методу Math.random, а саме той факт, що мінімальним значенням методу є 0, а максимальним, число, наближене до одиниці, але не одиниця.
Використаємо метод Math.floor – відкидання залишку.
Ось як виглядатиме наша формула:
Math.floor(Math.random()*100)+1;
Чому саме такий формат запису?
Функція Math.floor(Math.random()*100) видасть будь-яке число від 0 до 99 (логічно, чи не так), адже якщо результатом Math.random буде мінімальне число – тобто 0, то метод Math.floor відкине остаток (якого немає) і результатом буде 0. Якщо ж результатом Math.random буде максимальне число – тобто 0,999999…. (множимо на 100 і отримуємо 99,99999….), то Math.floor відкине остаток і результатом буде 99.
Саме тому до результату ми додаємо одиницю (наприкінці формули) і отримуємо потрібний ряд чисел від 1 до 100. За тим самим принципом можемо у формулі замінити 100 на будь-яке потрібне нам число і отримати випадковий генератор чисел від 1 до заданого числа.
Нижче наведений приклад програми, в якій генеруються випадкові числа від 1 до 100.
Випадковий результат від будь-якого заданого нами числа до будь-якого іншого заданого числа
Продовжуємо логіку попередньої формули для того, щоб повністю кастомізувати ряд чисел, які видаватимуться функцією. Припустимо, нам потрібно згенерувати будь-яке випадкове число від 50 до 100.
Формула матиме наступний вигляд:
Math.floor(Math.random()*51)+50;
Перевіримо, як це працює за логікою із попереднього прикладу. Припустимо, метод Math.random видав мінімальне число – 0. Виконуємо дії: 0*51 = 0 + 50 = 50. Округлюємо – і отримуємо мінімальний результат – 50 (саме те, що нам потрібно).
Тепер припустимо, що Math.random видав максимальний результат 0,99999… Виконуємо дії: 0,99999…*51 = 50,99999… + 50 = 100,99999… Округлюємо (відкидаємо остаток) і отримуємо максимальне число – 100. Всі інші числа, згенеровані функцією будуть перебувати у діапазоні від 50 до 100.
Сподіваюся, логіка зрозуміла.
А тепер формула генератора випадкових чисел із заданими нижнім та верхнім числами в діапазоні:
Math.floor(Math.random()*(1+High-Low))+Low;
де,
Low – це мінімальне число, яке ми хочемо отримати в діапазоні;
High – максимальне число в діапазоні.
Нижче наведений приклад програми, яка генерує випадкові числа від 50 до 100.
Сподіваюся, пояснення не виявилося занадто складним. Я досить багато писав, щоб повністю пояснити роботу і особливості методу Math.random. Втім, якщо у вас залишилися будь-які запитання, не соромтеся задавати їх у коментарях.
Квітень 4, 2013 о 19:01
Зробив простеньку міні-гру де павук сидить в центрі сцени, зліва вверху віконце динамічного тексту де відображаються очки гравця. Об’єкти (мухи) з’являються на сцені рандомно, гравець клікає на них мищкою і одержує очки. Розмір сцени 550*400.
addChild(muha);
muha.x=Math.random()*450+50; // від 50 до 500
muha.y=Math.random()*300+50; // від 50 до 500
Границі рандомної появи мухи щробив меншими за сцену, щоб зображення мухи не залазили за сцену.
Стикнувся з проблемою, — муха часто “генерується” на зоображенні павука (який в центрі сцени). Як можна зредагувати її появу таким чином, щоб вона не залазила на павука? Як приміром задати границі “від 50 до 250, від 300 до 500″ щоб середина випадала з області рандомної появи ?