Нерэндомный рэндом.

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

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

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

Значит во-первых общая сумма на всё. Разрезаемое яблоко. В реальной жизни, если тебе предлагают разделить яблоко на три куска любого разного размера (не говоря зачем), то поделишь ты или примерно поровну или уж точно не 99%+0,99%+0,001% — нож и руки не позволят так извратиться, да и два куска вообще уже как бы не куски, а так, мусор. Получается, мы подразумеваем некоторую нижнюю планку. Например минимальная кучка горошин — это 4 штуки.

Итого, чтобы поделить число подобным образом нужно:

случайное[от 0; до (max-3*min);шаг=k] — выдаст нам некое число N, делящее оставшийся кусок надвое:

Теперь, если мы хотим иметь более случайные результаты, то повторяем процедуру, получая второе значение M:

Соответственно будем иметь три доли, (не забываем сравнить M и N, чтобы не получить пересечения):

A = min+M; B=min+N-M; C=min+max-M-N

Если же мы хотим чуть повысить шансы для более взвешенных пропорций, то до деления отметкой M сравниваем, что больше max-N или N, а затем  большую величину режем рэндомно:

Соответственно при желании съехать в диспропорцию, режем меньшую долю.

Ситуация вторая, характерная. Есть стихии. Которые друг друга подавляют, например огонь и вода. Чаще всего делают или так, что меч не может быть и огненным и водным или делят промежуток случайно, в итоге мы можем получить полуводный-полуогненный, что тоже логично только тогда, когда стихии взаимодействуют, а не подавляют друг друга: например 80 огня + 20 воды = 60 урона огнём + 20 урона паром.

При взаиморавном подавлении же может случиться глупо выглядящий артефакт 50 огня + 50 воды = 0 урона стихиями. Ну и нафига мне такая математика? —  спросит игрок.

Значит нам во-первых нужно заведомо неравное деление, то есть введение минимально допустимого неравенства:

Делим отметкой N, сравниваем обе части, прибавляем минимум к большей (во избежания получения 50/50).

A=N; B=max-N+min

И, если N больше половины (max-min), то

A = N+min; B=max-N-min

Во-вторых нужно делать грамотное взаимоподавление. Практически, в простом случае, оказывается, чем больше неравенство, тем больше подавление меньшего большим. Тут можно играться с экспонентой, а можно усилить диспропорцию таким способом. Пляска с делением для того, чтобы сумма A+B оставалась равной max а не вылазила невесть куда, требуя костылей и перебалансировки. Допустим A>B

A=A*A/B; B=B*B/A;

k=(A+B)/max;

A=A/k; B=B/k;

Для наглядности 55 огня и 45 воды дадут примерно 65 и 35. Не забываем об ошибках округления, чтобы не вышло 65 против 36 например, то есть делаем проверку на верность условия A+B=max, если, конечно, не хотим маленьких сюрпризов.

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

Если же выводятся начальные характеристики стихий, а урон расчётный, то логично, что огненный урон не будет выше 55. Но сильная сторона баланса что-то перетянет на свою сторону. Итого 55 урона огнём, 10 урона горячим паром (продукт взаимодействия стихий), 35 урона водой.

Почему же нельзя просто задать начальный минимум довольно большим, всегда получая сильный дисбаланс, без всяких квадратов-экспонент? Можно. Например выставив минимум 40% Вот только игрок заметит, что большая доля никогда не бывает меньше чем 70%. Меньше отдаётся на откуп случайности. Нужно ли вам так — решайте сами.

На этом оканчиваю занудство, да пребудет с вами Сила, а в ваших играх — Баланс!