У меня есть частичная покерная комбинация из 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>
возможностей?
Я предполагаю, что есть способ сделать это с помощью комбинаторики, но я не знаю, как бороться с зависимыми возможностями, учитывая, что количество оставшихся карт может измениться, а некоторые карты потенциально могут быть исправлены.
Является ли это вопросом статистики/вероятности или более вопросом программирования? – gung
Я собирался опубликовать его в stackoverflow, но их тэг 'statistics' говорит, что вместо этого вы можете разместить здесь свой вопрос, и это вопрос с алгоритмом, который не является вопросом программирования. – TLW
Точно как порядок важен? Это не имеет значения для стоимости покерной руки. Вам нужны графы в точности или приближения будут приемлемыми? Даже если порядок важен, существует не более 50 * 49 * 48 = 117600 возможных способов заполнить эти пробелы в вашем примере (и не более 5997600 в худшем случае с одной уже показанной картой: случай без показа карт длинный были разработаны и доступны практически для любого покерного сайта или книги). Это число довольно мало. – whuber