Интересное чтиво
September 19, 2025

Рандом ГВИНТа годами был не совсем рандомным — и никто этого не заметил

Перевод статьи подготовлен командой TgGwent специально для Telegram-канала «Бутеры от Бужи». Оригинальный текст авторства lerio2 переводила ViaDiva.


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

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

С Хоумкаминга – релиза ГВИНТА после завершения бета-теста – прошло 7 лет, уже почти 2 года у нас продолжается Бесконечный ГВИНТ, и вот наконец в августе 2025 года был обнаружен баг в механике «сотворения» (Create). Сколько киберспортивных матчей решалось из-за лёгкого перекоса в работе рандома? Мы никогда этого не узнаем.

Как обнаружили баг?

В августе 2025 года из-за изменений Совета Баланса пул преступлений за 5 провизии сократился до четырёх карт. Карте Сезам, откройся! подняли стоимость найма до 6, а стоимость найма карты Длинные уши понизили до 4. Ушлый торговец при разыгрывании на дальнобойный ряд, сотворяет преступление за 5 провизии. Ключевое слово «сотворить» означает, что игроку случайным образом предлагаются три варианта из всего пула на выбор.

Ещё одним обстоятельством, которые помогли выявить проблему именно в этом месяце, стал слишком сильный нерф популярных колод Синдиката, завязанных на карте Сезам, откройся!. Более популярной альтернативой неожиданно стала колода Банд на бухте. Она использует Ушлого торговца, чтобы создавать карту Тайное влияние — бронзовое преступление за 5 провизии.

По идее, из четырёх карт пулa «сотворение» должно случайным образом предлагать любые три, и вероятность получить Тайное влияние должна быть равна 3/4, то есть 75%.

Но произошло нечто странное – Торговец находил Тайное влияние подозрительно часто. Игроки заметили это и начали внимательно следить за каждым роллом с Торговца. Карта Тайное влияние всегда была одним из вариантов, которые предлагал Торговец… не было ни одного исключения.

В чем дело?

Доверять людям, которые в карточных играх говорят «никогда не выпадает» или «всегда даёт», не лучшая идея – в этом слишком много личного восприятия и субъективности. Сам я о баге не догадывался, потому что не играл колодой Банд на бухте. Услышал я об этом только от Shinmiri в конце августовского сезона. RyRy/Rykov провели эксперименты с Тайным влиянием и другими картами с механикой сотворения и поделились результатами с Shinmiri.

Вот что игроки рассказали мне:

  • баг затрагивает не только Торговца, а вообще все карты с механикой сотворения – в пуле из 4 карт одна оказывается гарантированной;
  • судя по тестам, этой гарантированной картой обычно становится та, что вышла последней; остальные закономерности пока неясны, и непонятно, что определяет выбор, если сразу несколько карт вышли в одном дополнении (мы убедились, что это точно не ID карты);
  • (по словам RyRy от Rykov) баг, скорее всего, вызван сочетанием двух факторов: что изначальный список карт не рандомизируется, а в модуле тасовки есть ошибки.

Происхождение бага (предположение)

Как можно было бы спроектировать алгоритм механики «сотворения»? Можно, например, просто выбрать три случайных числа от 1 до длины списка возможных карт, а потом взять карты, соответствующие выбранным числам.

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

Как же тогда появляется баг, когда одна карта из пула в 4 карты всегда гарантирована? На самом деле это очень просто: нужно добавить ограничение: «тасовка считается корректной только в том случае, если каждая карта сменила свою позицию».

Тогда при изначальном порядке карт (1, 2, 3, 4), после такой «перемешки» и выборе трёх последних, карта (1) всегда окажется среди этих трёх, иначе конфигурация признаётся недопустимой.

Так как список изначально упорядочен по какому-то (неизвестному нам) правилу, гарантированной картой всегда оказывается одна и та же. Например, в случае с Торговцем это всегда Тайное влияние.

Кстати, есть ещё одна популярная карта с механикой сотворения и пулом ровно из четырёх вариантов – Филавандрель с силой 5 при разыгрывании в рукопашном ряду. Я провёл тест и в результате получилось, что Запасной план (последняя выпущенная карта из пула возможных карт) создавался в 42 случаях из 42 (100%).

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

Тестирование «чудаковатого» алгоритма

Я попросил ChatGPT написать на Python симуляцию ошибочного алгоритма с описанными выше правилами, чтобы определить вероятность сотворения карты в зависимости от её позиции в начальном списке (предположим, что мы берём 3 карты с конца). Для 100 000 сотворений распределение вероятностей получилось следующим:

Колонки «5 из …» – это симуляции с учётом Знатока рун – карты, которая увеличивает число предлагаемых вариантов для механики «сотворение» с 3 до 5. Как видим, аналогичный эффект «гарантированной карты» проявляется и для сценария «5 из 6» (до этого легко догадаться, если немного подумать 😉). Так и оказалось – я провёл тест с пулом из 6 эльфов за 4 провизии для карты Запасной план, и Ловец (один из последних выпущенных эльфов) выпал во всех 36 случаях из 36.

Самая интересная часть в том, что вероятность оказывается неравномерной даже между, казалось бы, одинаковыми картами. В чём реальная разница между 2-й и 4-й картой в стопке из 4? Вроде бы позиции у них равнозначны. Я не стал полностью погружаться в тему, но это любопытная математическая задачка с подвохом. Если решать задачу через перестановки, то для карт 2–4 шансы должны быть равными. Если же решать через дерево событий, то вероятность для второй карты – 5/9, а для третьей и четвёртой – 10/13. Но… мы понимаем, что иногда конфигурации признаются «недопустимыми».

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

Посмотрим, насколько результаты симуляции «чудаковатого алгоритма» соответствуют реальности на примере двух часто встречающихся «рандомных» карт: Выходной день Лавка и РенфриЗнатоком рун.

Выходной день Лавка

(все таблицы вы можете посмотреть в Google Sheets)

Номера в скобках в заголовках столбцов соответствуют количеству сыгранных «режимов» Лавка

9 «стойких» Лавков из 10. Я клянусь, я видел 8+ Лавков со стойкостью намного чаще, чем 8- в этих тестах.

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

Номера выше могут быть полезны для тех, кто играет Лавка без Знатока рун – как и во время игры, так и при создании колоды. Например, можно с высокой долей вероятности рассчитывать на пойнтслэм или стойкость при разыгрывании Лавка: рыцаря, а вот вероятность уничтожения вражеского артефакта выглядит ниже, чем 50/50 – тогда следует взять в колоду другие карты для уничтожения артефактов.

Ренфри + Знаток рун

Здесь выборка ещё меньше, потому что процесс тестирования с Ренфри еще более утомительный, чем с Лавком. В лучшие моменты мне удавалось зафиксировать 2×5 благословений за ход, но часто я просто не успевал, и поэтому размер пула благословений и пула проклятий различается. Для такого теста нужен либо более усидчивый игрок, либо гений, способный автоматизировать процесс.

Если выборки в 75 или 57 случаев достаточно, чтобы уловить тенденцию, то Ренфри заметно склонна к контролю (Гордость = уничтожает отряд с силой ≤ 8, Гнев = наносит 6 урона), в то время как благословения тяготеют к получению кэрриовера (Терпение = восстановление способности через 8 ходов, Смирение = усиливает на 4 после паса, Доброта = усиливает чётные/нечётные отряды).

Стоит отметить, что без Рунного мага различия в вероятностях у Ренфри, скорее всего, были бы незначительными.

Заключение

Стыд и срам CDPR за баг с механикой сотворения – такого не должно было случиться, и, по правде говоря, это даже не баг, а откровенный просчёт программистов. Не могу понять, как можно было писать ядро игры без элементарной осторожности. Будет ли баг когда-нибудь исправлен? Я не знаю, но, скорее всего, нет – поддержка игры уже завершена.

Я бы очень хотел, чтобы сообщество ГВИНТа продолжило исследование бага с сотворением – к сожалению, у меня самого не хватает времени. Особенно здорово было бы провести тесты на больших выборках и выяснить, по каким именно параметрам упорядочиваются карты.

Удачных партий в ГВИНТ! Доверяйте не только сердцу карт, но и сердцу неизвестного программиста, который, видимо, думал именно о вас. Повторюсь – все таблицы можно найти в Google Sheets.


Комментарий от GwentData в X:

Очень впечатляющее открытие от @lerio2_pl. Я запустил несколько симуляций, и похоже, что [разработчики] использовали тасовку по принципу «дерранжмента» — а это в малых пулах создаёт сильнейший перекос. При выборе N-1 элементов из N один элемент появляется всегда со 100% гарантией.

Большая просьба — если вам понравилась статья, напишите свой комментарий по этой теме, так мы будем знать, что переводы и статьи вокруг мира ГВИНТА и вселенной Ведьмака вам интересны!