Адептус Механикус


Пн Дек 21, 2020 13:01
Mathematicus
76  Свободный искатель

"Поэт должен видеть то, чего не видят другие. И это же должен и математик"
Софья Ковалевская

===

Итак, сегодня я создал короткую стори- перемешивание массива 10 чисел.

Вот ссылка на тестирование: (убрана по техническим причинам)

Сб Дек 26, 2020 18:00
Mathematicus
76  Свободный искатель

Итак, про перемешивание массива:

1. Для чего это нужно?

Cамое очевидное применение – перетасовка карт, но так же и расстановка чего угодно в случайном порядке. Несколько примеров:
а) Если 4 союзника и 6 врагов должны сделать в раунде по одному ходу, в случайном порядке.
б) Если вы хотите создать подземелье 5х5 пещер, в котором нужно расположить ровно одного Вампуса, ровно две колонии Супер-Летучих-Мышей и ровно три глубокие ямы, причём так, чтобы ничто из этого не накладывалось ни друг на друга ни на центральную пещеру(точку входа игрока), ни на 4 пещеры, соседних с центральной – тогда тасуете 20 "карт", и заполняете ими подземелье(кроме центральных полей).
в) Если вы хотите, чтобы 7 характеристик вашего героя имели все значения от 1 до 7, в случайном порядке(например, Сила=7, Восприятие=5, Выносливость=3, Харизма=6, Интеллект=4, Ловкость=2, Удача=1) и чтобы игрок мог сколько угодно делать их "реролл".

— возможных применений просто ну ОЧЕНЬ много.

2. Алгоритм, простыми словами.


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


3. Тонкости реализации на митриле, для продвинутых.

Очевидно, нам понадобится сделать следующие функции:

Swap(n, m) {local: k, l}
(n,m) – номера ячеек, которые функция обменяет местами
{local: k, l} – другие переменные, которые затрагивает эта функция
= = =
RandFromRange(n, m) {local: k, return r} // m > n
(n, m) – диапазон, из которого будет выбрано случайное число от n до m
{local: k, – вспомогательная переменная, которую затрагивает эта функция
return r} – переменная, в которую будет помещено сгенеренное число
= = =
Shuffle(array a() from i to 10) {}
– собственно, перемешивание массива от элемента i и до конца. Она использует обе вышеобозначенные функции и затрагивает различные переменные, которые я уже не стал упоминать.
= = =
Менее очевидно, но вовсе не менее важно – создать функции:
Get(n from a) {return r} – поместить значение ячейки a[n] в переменную r
Set(r to a[m]) – поместить значение переменной r в ячейку a[m]
– их использование позволит сделать функцию Swap заметно короче и, главное – значительно упростит возможное расширение массива, если оно понадобится.

Представьтесь для добавления комментариев - регистрация в один клик!