На Two Plus Two покерный покер, как вы получаете лучшую комбинацию из 5 карт из 7, которые вы ей передали?
Можно ли извлечь эту информацию из значения эквивалентности?
Я понимаю, что чем выше значение эквивалентности, тем лучше. Категория и ранг также могут быть извлечены из значения эквивалентности. Но есть ли способ узнать, какая лучшая комбинация из 5 карт из тех 7, которые вы ей передали?
Twoplustwo является самым быстрым оценщиком покерных комбинаций (14-15 миллионов раздач в секунду). Вы даете ему свои 7 карт, и он выплевывает значение эквивалентности руки. Чем выше значение, тем лучше карта.
Вот отличная сводка по двум темам: http://www.codingthewheel.com/archives/poker-hand-evaluator-roundup
Кэшированная версия ссылки выше: http://web.archive.org/web/20130116102452/http://www.codingthewheel.com/archives/poker-hand-evaluator-roundup
3 ответа
(отказ от ответственности: я работаю над покерным программным обеспечением, которое, помимо прочего, проводит оценку рук)
Вы даете ему свои 7 карт, и он выплевывает значение эквивалентности руки.
это делают несколько оценщиков, и если я не ошибаюсь, некоторые из них вычисляют более ста миллионов раздач в секунду (!). Эти оценщики в основном сводятся к 7 поискам массива в гигантском массиве, и для оценки руки требуется всего несколько циклов (несмотря на промахы в кеше). Я не думаю, что 14-15 миллионов в секунду где-то ближе всего к скорости. CactusKev в 10 раз быстрее, если я не ошибаюсь.
Теперь, чтобы ответить на ваш вопрос:
Как вы получаете лучшую комбинацию из 5 карт из 7, которые вы ей передали?
Ну, это не говорит вам, но когда у вас есть сила руки, это может стать очень простым: вам не нужно заново изобретать колесо.
Вы можете использовать силу, чтобы упростить ваши вычисления "лучшие пять из семи".
Вы также можете использовать другие библиотеки, отдавая свои пять лучших карт (а не только их силу), или вы можете использовать свои силы, чтобы найти пять лучших карт самостоятельно.
Я просто приведу несколько примеров...
Вы знаете, что у вас есть фулл-хаус (он же "лодка"), затем вы знаете, что вы ищете три карты с одинаковым рангом и лучшую пару (если есть две пары, но вы обязательно найдете хотя бы один, потому что оценщик сказал вам, что у вас есть лодка).
Вы знаете, что у вас есть стрит: найдите пять карт, которые следуют друг за другом, начиная с лучшей (остерегайтесь специального чехла для колесика).
Вы также можете получить немного больше удовольствия от стрита: вы можете взять силу каждого возможного стрита и сравнить силу, которую дает вам оценщик. Если он соответствует, скажем, стриту с десятью высокими, просто найдите любую карту Т, 9, 8, 7 и 6 (независимо от масти).
Вы знаете, что у вас "нет пары": просто возьмите пять самых высоких карт, которые вы найдете
и т.п.
Есть только несколько разных рангов... Они могут быть, например:
NO_PAIR
ONE_PAIR
TWO_PAIRS
SET
STRAIGHT
FLUSH
FULL_HOUSE
FOUR_OF_A_KIND
STRAIGHT_FLUSH
(Вы можете, конечно, создать промежуточные случаи "прямой колес" и "прямой поток колес" и "королевский поток", если хотите, и т. д.)
Когда вы знаете, какой тип вашей руки (благодаря быстрому оценщику, который вы используете), просто переключитесь на кусок кода, который находит пять лучших из семи для этой конкретной руки.
Я думаю, что это хороший способ для продолжения, потому что вы используете сверхбыстрый оценщик, и это значительно упрощает вашу логику.
При запуске вам нужно будет вычислить strenth один раз, например, с помощью вычисления:
HIGHEST_NO_PAIR_HAND = ultraFastEvaluator( "As Kd Qh Jc 9d 5s 2c" );
HIGHEST_FULL_HOUSE = ultraFastEvaluator( "As Ac Ad Kh Ks 8s 2h" );
Я, конечно, не рекомендую использовать здесь строки. Это просто пример...
Затем вы можете найти для каждой раздачи пять лучших:
- рассчитать силу с помощью быстрого оценщика
- это <= HIGHEST_NO_PAIR_HAND?
- да: возьми пять старших карт
- нет: это <= HIGHEST_ONE_PAIR_HAND? да: взять старшую пару + старшие три карты нет: это <= HIGHEST_TWO_PAIRS_HAND?
- и т.п.
Так что, по моему мнению, вы могли бы повторно использовать API, который непосредственно находит пять лучших из семи, или полностью переписать свой собственный, но это будет быстрее, если вы используете результат быстрого оценщика, чтобы затем упростить свою логику.
РЕДАКТИРОВАТЬ обратите внимание, что не обязательно один способ сделать "пять лучших из семи". Например, с As Ac на доске Kc Kd Qh Qs 2c оба варианта "As Ac Kc Kd Qh" и "As Ac Kc Kd Qs" являются "пятью лучшими" (костюм последней королевы не имеет значения).
Нет, эту информацию невозможно извлечь. Таблица поиска содержит только значения эквивалентности, которые разбиты на тип и ранг руки; другая информация не сохраняется.
Если вам нужно оценивать миллионы рук в секунду и получать выигрышную руку для каждой, а не только для ранга, вам нужно использовать другого оценщика. Если вам нужно только извлечь выигрышную руку редко, вы можете использовать этот оценщик и прибегнуть к более медленному методу, чтобы найти лучшие 5 карт, когда это необходимо.
Старый пост, но я попробую. Если вы используете поиск по таблице (например, упомянутые выше массивы из 7 карт, или метод Рэя Уоттона), создайте вторую таблицу с информацией о вашей цели в тех же позициях слотов. Пример: я оказался в слоте 167,452, чтобы найти свой eval, теперь я посмотрю на другой массив в слоте 167,452, чтобы найти свою 5-карточную руку.
Одна карта может быть представлена 6 битами - 2 для масти и 4 для ранга. 30 битов дадут вам всю 5-карточную руку. Может быть, не все так просто, но это общая идея. Я использовал эту точную технику для некоторых вещей, которые я делал некоторое время назад.
В качестве альтернативы, вы можете передать все комбинации из 7 карт и 5 карт (я полагаю, 21 из них) и выяснить, какой из них соответствует оригинальному eval.
Оценщик двух рук может оценить пять карт. Вот код для этого в C#:
int LookupFiveCardHand(int[] cards) {
//assert cards size is 5
int p = HR[53 + cards[i++]];
p = HR[p + cards[i++]];
p = HR[p + cards[i++]];
p = HR[p + cards[i++]];
p = HR[p + cards[i++]];
return HR[p];
}
Обратите внимание, что есть 6 массивов, несмотря на 5 карт.
В любом случае, поскольку оценщик очень быстрый, вы можете просто сравнить каждую возможную комбинацию из 5 карт. Рука, содержащая 7 карт, будет иметь 21 комбинацию из 5 карт. Код в C#:
List<int> GetBestFiveCards(List<int> sevenCardHand) {
List<List<int>> fiveCardHandCombos = new List<List<int>>();
// adds all combinations of five cards to fiveCardHandCombos
for (int i = 0; i < sevenCardHand.Count; i++) {
for (int j = i+1; j < sevenCardHand.Count; j++) {
List<int> fiveCardCombo = new List<int>(sevenCardHand);
fiveCardHandCombos.RemoveAt(j); // j > i, so remove j first
fiveCardHandCombos.RemoveAt(i);
fiveCardHandCombos.Add(fiveCardCombo);
}
}
Dictionary<List<int>, int> comboToValue = new Dictionary<List<int>, int>();
for (int i = 0; i < fiveCardHandCombos.Count; i++) {
comboToValue.Add(fiveCardHandCombos[i], LookupFiveCardHand(fiveCardHandCombos[i]));
}
int maxValue = comboToValue.Values.Max();
return comboToValue.Where(x => x.Value == maxValue).Select(x => x.Key).First(); //grab only the first combo in the event there is a tie
}