2016-01-09 3 views
0

У меня есть частичная покерная комбинация из 5 карт. Обратите внимание, что порядок важен, и пробелы могут быть где угодно. (Так, например, я мог бы иметь 10H <blank> <blank> KH <blank>)Оценка частичной 5-карточной игры в покере

Я также знаю, какие карты остаются (т. Е. Некоторое подмножество (стандартная 52-карточная) колода, минус любые карты в частичной руке). (Всегда осталось достаточно карт, чтобы заполнить руку)

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

Наивный алгоритм (цикл по всем возможным путям заполнения пустых пространств от оставшихся карт, увеличивая количество всех заполняемых рук, работает), но слишком медленный (в худшем случае - 52!/(52-5)! ~= 312 million) ,

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

if (hasFlush) { 
    if (hasRoyal) 
     return PokerHand.ROYAL_FLUSH; 
    if (hasStraight) 
     return PokerHand.STRAIGHT_FLUSH; 
} 
if (maxOfAKind == 4) 
    return PokerHand.FOUR_OF_A_KIND; 
if (rankCountCounts[3] == 1 && rankCountCounts[2] == 1) 
    return PokerHand.FULL_HOUSE; 
if (hasFlush) 
    return PokerHand.FLUSH; 
if (hasStraight) 
    return PokerHand.STRAIGHT; 
if (maxOfAKind == 3) 
    return PokerHand.THREE_OF_A_KIND; 
if (rankCountCounts[2] == 2) 
    return PokerHand.TWO_PAIR; 
if (rankCountCounts[2] == 1) 
    return PokerHand.ONE_PAIR; 
return PokerHand.HIGH_CARD; 

Итак, как я делаю это таким образом, что не требует цикла по <remaining>!/<remaining - blank spaces> возможностей?

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

+0

Является ли это вопросом статистики/вероятности или более вопросом программирования? – gung

+0

Я собирался опубликовать его в stackoverflow, но их тэг 'statistics' говорит, что вместо этого вы можете разместить здесь свой вопрос, и это вопрос с алгоритмом, который не является вопросом программирования. – TLW

+0

Точно как порядок важен? Это не имеет значения для стоимости покерной руки. Вам нужны графы в точности или приближения будут приемлемыми? Даже если порядок важен, существует не более 50 * 49 * 48 = 117600 возможных способов заполнить эти пробелы в вашем примере (и не более 5997600 в худшем случае с одной уже показанной картой: случай без показа карт длинный были разработаны и доступны практически для любого покерного сайта или книги). Это число довольно мало. – whuber

ответ

1

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

Как это сделать таким образом, чтобы не требовалось зацикливаться на <remaining>!/<remaining - blank spaces>?

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

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

  1. быть в состоянии определить, когда заготовка не может в дальнейшем повлиять на тип руки . Для ровно 5-карточной руки это минимально, но если вы , взяв лучшую 5-карточную комбинацию из 7 карт, например, в Холдеме, это может быть .

  2. Используйте вероятность того, что оставшаяся карта (карты) увеличит значение руки . Например, с [4h, 4c, 4d, 2s, < blank>] единственными картами , которые имеют значение, являются 4s, 2h, 2d, 2c. Любая другая карта собирается , чтобы дать вам 3 в своем роде, так что вам действительно не нужно повторить все варианты на этом этапе. Это действительно то же самое, что и в пункте 1, просто сделал еще один шаг.

+0

К сожалению, покерные руки - это руки в покере, это тяжело под или над - представляет определенные руки. Например, если у вас есть вся колода минус три из четырех тузов, вы можете сделать королевский флеш одним способом. Но этот метод будет чередоваться между 0 и 10 (!) Возможностями. Интересно, могу ли я использовать гибрид между Монте-Карло и «перечислять все возможности подсчета очков и рассчитать количество способов рисования указанной руки из колоды» для редких рук. Хм. – TLW

Смежные вопросы