Генерация случайных чисел¶

08.09.2021

Многие игры полагаются на случайность для реализации основной игровой механики. Эта страница расскажет вам о распространенных типах случайности и о том, как реализовать их в Godot.

После краткого обзора полезных функций, генерирующих случайные числа, вы узнаете, как получать случайные элементы из массивов, словарей и как использовать генератор шума в GDScript.

Компьютеры не могут генерировать «истинные» случайные числа. Вместо этого они полагаются на генераторы псевдослучайных чисел (ГПСЧ).

Глобальная область видимости по сравнению с классом RandomNumberGenerator¶

Godot предлагает два способа генерации случайных чисел: с помощью методов глобальной области видимости или с помощью класса RandomNumberGenerator.

Методы глобальной области легче настроить, но они не обеспечивают такого большого контроля.

RandomNumberGenerator требует использования большего количества кода, но предоставляет множество методов, которых нет в глобальной области видимости, такие как randi_range () и randfn (). Кроме того, он позволяет создавать несколько экземпляров, каждый со своим семенем.

В этом руководстве используются методы глобальной области, за исключением случаев, когда метод существует только в классе RandomNumberGenerator.

Метод randomize ()¶

В глобальной области вы можете найти метод randomize (). Этот метод следует вызывать только один раз, когда ваш проект начинает инициализировать случайное начальное число.Вызывать его несколько раз нет необходимости, это может отрицательно сказаться на производительности.

Поместите его в метод _ready () сценария основной сцены - хороший выбор:

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

При использовании класса RandomNumberGenerator вы должны вызвать randomize () для экземпляра, поскольку он имеет собственное начальное значение:

Получение случайного числа¶

Давайте рассмотрим некоторые из наиболее часто используемых функций и методов для генерации случайных чисел в Godot.

Функция randi () возвращает случайное число от 0 до 2 ^ 32-1. Поскольку максимальное значение огромно, вы, скорее всего, захотите использовать оператор по модулю (%), чтобы связать результат между 0 и знаменателем:

randf () возвращает случайное число с плавающей запятой от 0 до 1. Это полезно, помимо прочего, для реализации системы взвешенной случайной вероятности.

randfn () возвращает случайное число с плавающей запятой в соответствии с нормальным распределением. Это означает, что возвращаемое значение с большей вероятностью будет около среднего (по умолчанию 0,0), которое зависит от отклонения (по умолчанию 1,0):

rand_range () принимает два аргумента от и до и возвращает случайное число с плавающей запятой между от и до:

RandomNumberGenerator.randi_range () принимает два аргумента from и to и возвращает случайное целое число между from и to:

Получить случайный элемент массива¶

Мы можем использовать генерацию случайных целых чисел, чтобы получить случайный элемент из массива:

Чтобы один и тот же фрукт не собирался более одного раза подряд, мы можем добавить в этот метод больше логики:

Этот подход может быть полезен, чтобы сделать генерацию случайных чисел менее повторяющейся. Тем не менее, это не предотвращает результаты «пинг-понга» между ограниченным набором значений. Чтобы этого не произошло, используйте выкройку мешка с перетасовкой.

Получить случайное значение словаря¶

Мы можем применить аналогичную логику от массивов к словарям:

Взвешенная случайная вероятность¶

Метод randf () возвращает число с плавающей запятой от 0,0 до 1,0. Мы можем использовать это для создания «взвешенной» вероятности, когда разные исходы имеют разные вероятности:

«Лучшая» случайность с использованием мешков в случайном порядке¶

Взяв тот же пример, что и выше, мы хотим собирать фрукты наугад. Однако использование генерации случайных чисел при каждом выборе фрукта может привести к менее равномерному распределению. Если игроку повезет (или не повезет), он может получить один и тот же фрукт три или более раз подряд.

Вы можете сделать это с помощью выкройки мешков с перетасовкой . Он работает путем удаления элемента из массива после его выбора. После множественного выбора массив оказывается пустым. Когда это произойдет, вы повторно инициализируете его до значения по умолчанию:

При запуске приведенного выше кода есть шанс получить один и тот же фрукт дважды подряд. Как только мы сорвем фрукт, он больше не будет возможным возвращаемым значением, пока массив не станет пустым. Когда массив пуст, мы сбрасываем его обратно до значения по умолчанию, что позволяет снова получить тот же фрукт, но только один раз.

Случайный шум¶

Показанная выше генерация случайных чисел может показать свои пределы, когда вам нужно значение, которое медленно изменяется в зависимости от ввода. Входными данными могут быть позиция, время или что-то еще.

Для этого вы можете использовать функции случайного шума . Функции шума особенно популярны в процедурной генерации для создания реалистичного ландшафта. Godot предоставляет для этого OpenSimplexNoise, который поддерживает шум 1D, 2D, 3D и 4D. Вот пример с одномерным шумом:

© Copyright 2014-2021, Хуан Линецкий, Ариэль Манзур и сообщество Godot (CC-BY 3.0). Ревизия e041f617.

Сергей Иващенко

08.09.2021

Подписывайтесь на наши социальные сети!