Gamedev
Andrey Apanasik
4497

Тёмные секреты рандома

Краткая выжимка доклада Shay Pierce с GDC 2017 года о техниках при написания рандомайзера в своих играх.

В закладки

Shay работал над многие играми, в том числе над Hearthstone. В этом докладе он делится советами о том, как лучше реализовать систему рандома в своих играх.

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

Секрет #1: каждый пограничный случай, который может произойти, обязательно произойдёт

Как разработчик вы последняя линия защиты в таких вопросах. Часто бывает, что дизайнеры не умеют в матан (да-да, такое бывает), ваша задача донести до них этот нюанс.

Pity Timer

Система гарантирует, что вы рано или поздно получите редкий лут. Если говорить про Hearthstone, то вам как минимум гарантирована одна легендарка на 40 паков.

В Diablo 3 в своё время ввели систему, которая гарантировала дроп легендарки, если вы отыграли определённое количество часов. После получения счётчик сбрасывался.

Оригинального Blue post’а больше не найти, но сообщение упоминается во многих других постах.

The fact that some people claim to go for 10+ hours without finding a legendary is not only not our intent, but should in fact be impossible. We added a system in the expansion that tracks the amount of time you spend fighting creatures without finding a legendary and after a certain period of time will slowly start increasing the legendary drop rate.
Once a legendary drops for you, actual item not crafting recipe or material, we reset that timer. This is meant to be a safety net so that the random can never be too extreme to the negative end. If players are legitimately going 18+ hours and not seeing a legendary it’s possible that there are some bugs floating around that need to be identified.

Секрет #2: человеческий мозг плохо умеет в рэндом

Если шанс дропа шмотки 1%, то убив монстра 200 раз, люди понимают, что есть шанс, что они не получат шмотку, но всё равно они жалуются на это.

Они не ожидают подобного в реальности.

Многие игры эмулируют «справедливость». Pity Timer как один из вариантов.

Секрет #3: люди всё равно в любом случае будут жаловаться на рэндом и несправедливость

Занятная история произошла в сообществе игры The Urban Dead, где игрок отметил закономерность в RNG с таймингом. Если отсчитать примерно 8 секунд и нажать кнопку SEARCH, то рандом сработает в вашу пользу. Дальше в ветке ему указали на то, что «это нонсенс, т.к. в игре используется генератор случайных чисел». Но штука в том, что на вход в функцию как сид передавалось текущее время srand(time()), что и стало причиной подобной закономерности.

Как вариант реализации Pity Timer он приводит Lookup table, когда вес апается при неудаче, а при успехе весь сбрасывается до дефолтного состояния.

В MMORPG куча разных классов и их важность разница. Лут для некоторых классов катируется куда сильнее, чем для других. Часто для решения этого вопроса для каждого класса прописывают отдельные веса, чтоб уравновесить экономику игры.

Есть смысл завязывать систему дропа лута на распределении игроков и популярности класса.

Random hashing и deep echoes

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

Как пример приводит генератор вселенной, где сид одного уровня генерации используется для генерации нижних уровней. И если на каком-то этапе сид совпадёт, то вы получится одинаковые галактики/солнечные системы/планеты/города, в зависимости от того, на каком уровне произошла коллизия.

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

Тут всё зависит от восприятия игрока. Естественно на каком-то уровне элементы будут одинаковые — похожие дороги и т.п, но в силу того, что остальное окружение отличается, игрок может даже этого не заметить.

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

Нет идеального решения проблемы в силу математической природы задачи. Если у вас на входе больше, чем на выходе, то вы столкнётесь с «принципом голубей и ящиков», когда при условии, что у вас голубей больше, чем клеток, у вас точно будет клетка с более, чем одним голубем. Так называемый Принцип Дирихле.

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

Полезные ссылочки

Оригинальный доклад

Пишу про /gamedev (в частности, про /unity) и около него. Веду свой бложик, пишу что-то в дзене. - Твиттер. - Хабр. Всем добра (ノ◕ヮ◕)ノ*:・゚✧
{ "author_name": "Andrey Apanasik", "author_type": "self", "tags": [], "comments": 48, "likes": 33, "favorites": 155, "is_advertisement": false, "subsite_label": "gamedev", "id": 61300, "is_wide": false, "is_ugc": true, "date": "Sun, 28 Jul 2019 12:01:59 +0300", "is_special": false }
0
48 комментариев
Популярные
По порядку
Написать комментарий...

Оригинальный шар

30

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

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

Ответить
4

а почему сразу "сами дураки". Человек не всемогущ, он не может поднять камень весом 1 тонну, не может умом понять силу рандома. И это нормально.
Другое дело, что общество должно понимать особенности человека и стараться защищить его от пагубных вещей. У нас же есть хим. защита для нахождения в опасной среде, т.е. о физическом состоянии мы заботимся.
А защитить людей от рандома в лице азартных игр( который для человеческого ума опасен не меньше, чем яды для физического состояния) общество почему-то не желает.

Ответить

Уверенный бокал

Леха
15

А ещё надо защитить электорат от пагубного влияния правдивой информации, набирающих кредиты от информации о потенциальных рисках банскроства и так далее.

Херня это всё. Должен быть некоторый обязательный необходимый минимум. Иначе обеспечивая максимальный комфорт тупым будет происходить ухудшение условий для умных. Получится, что быть тупым выгоднее и человечество деградирует.

А далёкие потомки врановых будут изучать руины нашей цивилизации с недоумением.

Ответить
6

Ну по мойму такой вариант развития приведет к полному расслоения общества. "Тупые" будут получать свой минимум и не задумываться что почему и как, а "умные" будут использовать труд первых и обогощаться... стооооп :D

Ответить
0

"Иначе обеспечивая максимальный комфорт тупым будет происходить ухудшение условий для умных"
ты заявляешь об этом, как о данности, и все свои размышления основываешь на этом.
Хотя это просто догадка, а не аксиома и далеко не факт, что обеспечение комфорта всему человечеству сделает условия для элит хуже.
А если и сделает, то может это и правильно, т.к. сейчас разрыв между богатыми и бедными растет и это происходит бесконтрольно, потому и теория о создании мотивации для повышения конкуренции уже перестает работать

Да и именно отмена грубого естественного отбора превратила человека в развитое существо. Хотя по твоей логике, это обеспечило максимальный комфорт слабым и произошло ухудшение условий для сильных. но разве это не хорошо?

Ответить

Уверенный бокал

Леха
0

ты заявляешь об этом, как о данности, и все свои размышления основываешь на этом.

Ключевое слово: электорат
отмена грубого естественного отбора превратила человека в развитое существо

А когда это у нас для человечества перестал работать естественный отбор?

Ответить
0

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

Ответить

Уверенный бокал

Леха
0

Пф. Для такого глобального системного закона, как "эволюция", это, простите, хуйня.

Инвалиды в любом случае получают значительно меньший шанс на успешное размножение. А раньше вообще не было пренатальной диагностики и эти инвалиды рожались в любом случае все. А сейчас часть всё же абортируются. Так что наоборот.

Ответить
2

да какая хуйня) у нас миллионы инвалидов, которые получают деньги просто за свою болезнь. В естественном отборе им бы не помогали и они бы погибли. и 40 миллионов пенсионеров, которые могут не работать, но получать деньги. Надо напоминать, как с нетрудоспособными особями поступают при естественном отборе? И да, пенсионная система и принудительное взымание процентов -это как раз защита старших поколений от этого естественного отбора. Если бы всем было пофиг на эту защиту, то людям бы давали бОльшую ЗП, но после 60 просто посылали кушать травку.

Ответить

Уверенный бокал

Леха
–1

В естественном отборе им бы не помогали и они бы погибли.

Только в том случае, если бы это было более оптимальной стратегией выживания.

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

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

К тому же то, что вы называете "инвалидностью" может в изменившихся условиях стать бесспорным эволюционным преимуществом. Например, появится абсолютно смертельный вирус, который не заражает людей с синдромом Дауна. И если бы всех таких детей абортировали - человечество вымерло бы.

Ответить
0

"не только о своей тушке, но и о сородичах."
заботиться о полезных сородичах. С физической точки зрения инвалид с рождения -это уже сомнительный юнит в плане пользы и обществу было бы проще его умертвить и зачать нового. Но посольку мы гуманны и стараемся бороться с природным законом "выживает сильнейший, погибает слабейший", то конечно же эмбрион с кучей отклонений мы оставляем, государство и родители тратят на него кучу времени и сил.

Со стариками похожая ситуация. Полезный, т.е. трудоспособный пенсионер это конечно не проблема. Если конечно он работает(не обязательно официально, воспитание внуков это тоже работа).
А вот если он беспомощный, то это уже обуза для государства и детей и при естественном отборе ему бы не помогали.
Даже сравнительно недавно, в Японии, стариков просто уводили в лес. Вот он, отбор.
нашел тут статейку на счет вопроса актуальности отбора в наше время
https://shkolazhizni.ru/health/articles/51890/
отражает мои мысли во многом, разве что я не рассматриваю это строго негативно.

Ответить
2

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

Ответить
0

А что такое интеллект?

Ответить

Уверенный бокал

Леха
2

Вы всё ещё допускаете систематическую ошибку, применяя эволюционные законы к частностям, но не видите картины в целом.

Старики перестали быть обузой, как только НИОКР позволил без проблем их прокормить. После этого они наоборот, стали подспорьем, помогая воспитывать детей и сохраняя опыт, например.

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

Даже абсолютно беспомощные люди приносят пользу - двигая вперёд медицину в частности и науку в целом.

Статья крайне примитивна и поверхностна. Эволюционные механизмы работают не только на биологическом уровне, но и на социальном, информационном, технологическом и так далее. Причём делают это опять же не независимо.

Ответить
0

ну а я пару раз написал "физиологический" в контексте естественного отбора, тем самым дав понять, о чем говорю. Потом перестал и упростил до естественного отбора.
Как вижу- этот мой ход был не понят и мы сейчас уже совершенно отдалились в плане диалога. Если есть желание -можете перечитать. учитывая данную поправку: начиная с первой моей фразы про грубый естественный отбор я говорил исключительно о его физиологической плоскости.
Другие уровни отбора, о которых вы говорите, я бы обобщил в простой и емкий " интеллектуальный отбор" и это как раз тема, о которой я написал в самом первом и в предыдущем коментарии.

Ответить
1

Просто в % на попадание или % на выпадение — нужно использовать не случайное выпадение числа , а выпадение с блокировкой этого выпавшего числа — пока числа не закончатся . То есть 1% из 100 — должен падать раз в 100 раз , а не 100 раз подряд в конце 10000й серии .

Ответить

Садовый Денис

Голубев
0

А теперь попробуйте применить эту модель, когда шанс динамически изменятся, например, для вероятности попадания.

Ответить
0

Да без проблем — если вероятность увеличилась . Перезапускаем цикл . Если уменьшилась — продолжаем до истечения прошлого цикла .

Ответить
7

В целом когда рандом в игре - это не плохо.
Плохо - когда игра рандом.

Ответить
–4

разве плохо? шашки достаточно популярные

Ответить

Встречный Петя

Лот
21

Простите, что? В чем рандом в шашках?

Ответить
20

Комментарий удален по просьбе пользователя

Ответить

Встречный Петя

Comrade
19

Чувствую себя старым(

Ответить
–1

в дропе предметов и дропе чемпионов?

Ответить
1

Перекурил?

Ответить

Бюджетный паркур

Лот
0

В шашках уже два апдейта царство рандома

Ответить
8

Heart Stone

Ответить
1

Рэндом в heart stone

Ответить
0

Тоже самое подумал

Ответить
2

"Тоже самое"?
Откуда возмущение, когда ты на родном языке не в состоянии грамотно написать простое выражение.

Ответить
4

часто бывает, что дизайнеры не умеют в матан

Там точно был матан? Я, честно говоря, не очень понимаю, зачем дизайнерам (наверное, тут должны были быть геймдизайнеры?) и даже программистам нужен матан для создания рандомайзера

Ответить
7

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

Ответить
2

Математический анализ так-то матанал, любой студент это знает.

Ответить
–13

Я это всё матаном называю)

Ответить
1

Он там говорит "I've also worked with designers, who terrible aware of the math implications".

Ответить
5

Ужасное количество опечаток, и часто используются сложные неоднозначные конструкции. Читать неприятно.

Ответить
4

Отвратительно читается текст, не вычитан вообще, гуглоперевод какой-то. Да и на эту тему тут были уже статьи, гораздо более удобоваримый.

Ответить
0

Согласен, тоже первая мысль - гуглоперевод. Читается плохо. Приходится перечитывать куски. А тема то интересная.

Ответить
3

После шанса дропа редких вещей и карт в рагнарек онлайн с шансом 0.001% вообще не парюсь над цифрами больше единицы :)))

Ответить
–3

Heart Stone, серьёзно? Можно хотя бы загуглить название игры. И много других ошибок в грамматике

Ответить
4

Это сердечный камень, всё нормально.

Ответить
–1

Вы украли моё сердечко.

Ответить
1

Вспоминается старый анекдот:
Мужчин спросили на улице "какова вероятность встретить динозавра" и ответы всегда были близки к 0%.
Женщину спросили то же самое и она ответила 50%. На вопрос "почему 50%? это же чертов динозавр!" она спокойно ответила "ну я его либо встречу, либо нет".

Ответить

Садовый Денис

1

Лично моя позиция, что рандом не должен быть слишком рандомным.
Когда ты максимально эффективно играешь, а игра тебя наказывает, потому что сработала вероятность 0,0001%, это тупо несраведливо и отбивает дальнейшее желание играть.
А те, кто первым понял это и добавил коррекцию рандома — молодцы.

Ответить
0

почему перевод такой плохой? автор, ты мог просто почитать статью, прежде чем выкладывать?

Ответить
–1

Напомните как там работал механизм критического удара в вк3?
Псевдораспредление было вроде, шанс увеличивался с каждым ударом, правильно?

(В первую очередь вспомнил первую доту)

Ответить

Комментарии

{ "jsPath": "/static/build/dtf.ru/specials/DeliveryCheats/js/all.min.js?v=05.02.2020", "cssPath": "/static/build/dtf.ru/specials/DeliveryCheats/styles/all.min.css?v=05.02.2020", "fontsPath": "https://fonts.googleapis.com/css?family=Roboto+Mono:400,700,700i&subset=cyrillic" }