Случайные числа: Phaser.Math.RND

В библиотеке Phaser для работы со случайными значениями используется объект Phaser.Math.RND, предоставляющий набор методов для генерации случайных чисел, случайных элементов из массивов и выполнения вероятностных выборок. Этот объект основан на генераторе псевдослучайных чисел и позволяет обеспечить как простую случайность, так и повторяемость последовательностей через управление семенем (seed).


Инициализация и семя

Объект RND создаётся автоматически при запуске игры, поэтому явной инициализации не требуется:

const rnd = Phaser.Math.RND;

Для повторяемой случайности используется метод seed, который задаёт начальное значение генератора. Это позволяет получать одинаковые последовательности случайных чисел при каждом запуске с одним и тем же семенем:

rnd.seed = 12345;
console.log(rnd.integerInRange(1, 10)); // Всегда одно и то же число при заданном семени

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


Основные методы генерации чисел

Целые числа

  • integer() — возвращает случайное целое число в диапазоне от 0 до 2³²-1:
const value = rnd.integer();
  • integerInRange(min, max) — возвращает случайное целое число между min и max включительно:
const value = rnd.integerInRange(5, 15);

Дробные числа

  • real() — возвращает число с плавающей точкой в диапазоне от 0 (включительно) до 1 (не включительно):
const value = rnd.real();
  • realInRange(min, max) — дробное число в заданном диапазоне:
const value = rnd.realInRange(10, 20);
  • realSpread(value) — число от -value/2 до value/2, удобно для разброса координат или скоростей:
const offset = rnd.realSpread(100); // Значение от -50 до 50

Случайный выбор из массивов

Методы для работы с массивами позволяют извлекать случайные элементы или перемешивать массив:

  • pick(array) — возвращает случайный элемент массива:
const colors = ['red', 'green', 'blue'];
const color = rnd.pick(colors);
  • weightedPick(array, weights) — выбор элемента с учётом весов. Массив weights должен совпадать по длине с array:
const items = ['gold', 'silver', 'bronze'];
const weights = [5, 3, 2]; // вероятности 50%, 30%, 20%
const item = rnd.weightedPick(items, weights);
  • shuffle(array) — перемешивает элементы массива, используя алгоритм Фишера-Йейтса:
const numbers = [1, 2, 3, 4, 5];
rnd.shuffle(numbers);
console.log(numbers); // Массив в случайном порядке
  • remove(array) — удаляет случайный элемент из массива и возвращает его:
const items = ['apple', 'banana', 'cherry'];
const removed = rnd.remove(items);
console.log(removed, items); // удалённый элемент и оставшийся массив

Вероятностные функции

  • chance(percent) — возвращает true с вероятностью percent (от 0 до 100):
if (rnd.chance(25)) {
    console.log('Событие произошло с вероятностью 25%');
}
  • between(min, max) — проверка попадания числа в диапазон (реализуется через integerInRange):
const number = rnd.integerInRange(1, 10);
if (rnd.between(1, 5)) {
    console.log('Число в диапазоне 1–5');
}

Применение в играх

RND активно используется для:

  • Генерации случайных координат спрайтов и объектов:
const x = rnd.between(100, 700);
const y = rnd.between(50, 550);
this.add.sprite(x, y, 'star');
  • Создания случайного поведения врагов:
enemy.speed = rnd.realInRange(50, 150);
enemy.direction = rnd.pick(['left', 'right']);
  • Выпадения предметов с разной вероятностью:
const loot = rnd.weightedPick(['coin', 'gem', 'heart'], [70, 20, 10]);
  • Перемешивания уровней или карт:
rnd.shuffle(levelTiles);

Преимущество Phaser.Math.RND в том, что все случайные действия становятся контролируемыми и предсказуемыми при задании семени, что критично для повторяемых игровых сценариев, тестирования и процедурной генерации.


Особенности генератора

  1. Генератор псевдослучайный, поэтому с одинаковым семенем последовательность чисел всегда одинаковая.
  2. Методы работают быстро и подходят для реального времени.
  3. Встроенные функции позволяют не только получать числа, но и напрямую работать с массивами и вероятностями, что упрощает игровой код.

Практические советы

  • Использовать seed при необходимости процедурной генерации уровней.
  • Для динамических случайных событий, где повторяемость не нужна, семя можно не задавать.
  • Методы pick и shuffle удобны для случайной расстановки объектов и генерации контента без ручного перебора.

Phaser.Math.RND предоставляет полный набор инструментов для всех типов случайных вычислений в играх, от простых чисел до сложных вероятностных выборок и процедурной генерации контента.