Алгоритм имитации обмана при тасовании в карточной игре

#algorithm #math #random #shuffle

Вопрос:

Я хотел бы создать алгоритм перетасовки для онлайн-TCG, который имитировал бы пассивную перетасовку, которую делают игроки tcg.

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

Например, в MTG колода, перетасованная таким образом, будет иметь случайное распределение карт любым способом, где в любом наборе из 10 карт не будет скопления более 6-7 или менее 3-4 земель.

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

Есть какие-либо предложения о методах достижения этой или других более «естественных» перетасовок?

Комментарии:

1. Вот идея: (1) Инициализируйте перетасованную колоду в пустой список и сохраните все оставшиеся земли в одной структуре данных, а все оставшиеся не-земли в другой структуре данных. (2) Поддерживайте значение p , которое указывает вам вероятность того, что следующая выбранная карта является землей, а следующая выбранная карта-не-землей. (2) Цикл: (2.1) Выберите карту наугад в одном из двух наборов оставшихся карт и добавьте ее в список перетасованных колод; (2.2) Вероятность обновления p зависит от количества оставшихся земель и неземель и от количества земель в окне последних 10 карт.

2. @stef Я рассматривал это, но у этого есть несколько проблем: 1. Это не обеспечивает согласованности между концами и серединой колоды. Перетасовка должна быть равномерной по всей колоде. 2. Фактический вариант использования будет с колодой без каких-либо «земель», но несколько карт будут иметь разную степень «сходства», к которой я хочу применить этот метод тасования, поэтому метод должен учитывать несколько мер сходства, в которых несколько карт могут быть частью более чем одной группы сходства(возможно, все с разным весом).

3. Затем вы можете создать функцию, которая вычисляет для каждой оставшейся карты, насколько она похожа на 10 предыдущих карт; затем нормализуйте эти значения сходства на вероятности, которые равны 1, и выберите одну из оставшихся карт случайным образом, следуя этим вероятностям.

4. @Стеф, ах да, хорошая идея! Мне все равно нужно было бы подумать о том, может ли это вызвать проблемы с наличием разных позиций в колоде с разными вероятностями распределения. Я мог бы «вырезать» колоду случайным образом после этого, чтобы исправить это, но, возможно, есть лучшее решение.

5. Это, безусловно, даст разным позициям разные общие вероятности, да. Представьте, что в колоде ровно три карты A, B и C, где B похож как на A, так и на C, но A и C не похожи. Тогда B вряд ли закончится посередине — либо он будет выбран в качестве первой карты, либо A или C будут выбраны в качестве первой карты, и оба будут «отталкивать» B и уменьшать вероятность того, что он будет выбран в качестве средней карты.