Найти тему
Игровой движок Godot engine

№126. Практика. Генерация неповторяющихся цепочек чисел.

Задача весьма простая — нам надо получить цепочку случайных чисел так, чтобы ближайшие в ряду числа не повторялись.

Например в выборке от 1 — 3 цепочка должна выглядеть вот так :

1.2.3.2.3.1.2.1.3 и так далее.

Первое, что приходит на ум, это проверять каждое следующее сгенерированное число с предыдущим.
Но, как минимум это будет затратно, ибо на коротких выборках , к примеру 1-2 , будет очень часто попадаться одинаковое число, и потребуется еще один цикл чтобы создать новое.

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

На схеме это выглядит примерно вот так:

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

На гифке, сверху результат этого алгоритма , и снизу результат обычного рандома.
выборка от 1 до 9. Выводим 15 чисел.

-2

Ну и для наглядности зажмем дипазон от 1-2.

-3

Тут уже более заметен результат.

Код (для диапазона 1-2):

Массив nums это место куда скидываем числа.
Массив nums это место куда скидываем числа.

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

Надеюсь вам был полезен этот материал.
Подписывайтесь на канал,
вступайте в группу в ВК, и не забывайте что у нас есть дискорд сервер.
Удачи в изучении годо !

#godot #gdscript #программирование #игровой движок #уроки