Подтвердить что ты не робот

7-карточный покерный оценщик рук

Кто-нибудь знает быстрый алгоритм оценки 7-карточных покерных рук? Что-то, что более эффективно, чем просто грубая сила, проверяющая каждую комбинацию рук из 5 карт из набора из 7.

Приветствия,

Пит

4b9b3361

Ответ 1

На этом сайте вы найдете список библиотеки оценщиков покерных рук и дается несколько подробностей о каждом из них. Большинство из них предназначены для 5 карт, но есть по крайней мере один для 7-карточной руки, называемый Snezee7 Evaluator. Кроме того, сайт дает отличный обзор различных методов и алгоритмов, используемых для быстрого анализа рук в покере.

Я использовал порт Keith Rule С# Pokersource Evaluator в нескольких различных покерных проектах и считаю, что это отличная библиотека. Есть много умных трюков, которые вы можете использовать, чтобы сделать действительно быстрых оценщиков рук, но писать код - это большая работа, и я бы предложил использовать существующую библиотеку.

Ответ 2

Я написал один в JavaScript. Метод оценки ядра использует только бит-манипуляции, так что это очень быстро. Имея это в виду, глядя на 21 комбинацию, все еще очень быстро. Единственный раз, когда нам нужно идти глубже, это когда происходит связь. Когда это произойдет, нам нужно заглянуть в более подробную информацию, чтобы увидеть, какая из пяти карт на самом деле лучшая. Вот решение, которое я придумал:

hands=["4 of a Kind", "Straight Flush", "Straight", "Flush", "High Card",
       "1 Pair", "2 Pair", "Royal Flush", "3 of a Kind", "Full House" ];
var A=14, K=13, Q=12, J=11, _ = { "♠":1, "♣":2, "♥":4, "♦":8 };

//Calculates the Rank of a 5 card Poker hand using bit manipulations.
function rankPokerHand(cs,ss) {
  var v, i, o, s = 1<<cs[0]|1<<cs[1]|1<<cs[2]|1<<cs[3]|1<<cs[4];
  for (i=-1, v=o=0; i<5; i++, o=Math.pow(2,cs[i]*4)) {v += o*((v/o&15)+1);}
  v = v % 15 - ((s/(s&-s) == 31) || (s == 0x403c) ? 3 : 1);
  v -= (ss[0] == (ss[1]|ss[2]|ss[3]|ss[4])) * ((s == 0x7c00) ? -5 : 1);

  document.write("Hand: "+hands[v]+((s == 0x403c)?" (Ace low)":"")+"<br/>");
}

//Royal Flush   
rankPokerHand( [ 10, J, Q, K, A],  [ _["♠"], _["♠"], _["♠"], _["♠"], _["♠"] ] ); 

Объяснение здесь
Демо здесь

Ответ 3

Рад, что вы спросили:) Да, здесь совершенно новое решение, которое может быть просто билетом:

Код: http://code.google.com/p/specialkpokereval/
Блог: http://specialk-coding.blogspot.com/2010/04/texas-holdem-7-card-evaluator_23.html

Эволюция коммерческого уровня этого оценщика доступна для iPhone/iPod Touch через iTunes Store. Он назвал " Poker Ace".

Отличное резюме различных решений, в комплекте со ссылками, найдено в блоге Джеймса Девлина " Кодирование колеса".

Один оценщик, который еще не обсуждался, Klaatu.

Удачи!

Ответ 4

Я думаю, вы должны сделать 21 комбинацию и использовать какую-то таблицу 7462. 1-й: любые 7 карт имеют 21 комбинацию из 5 карт 2-й: все возможные финальные покеры (2.598.960) представляют собой один из 7462 разных видов рук так что это легко.

Вам просто нужно взглянуть на каждые 21 комбинацию ваших карт и, по каждому из них, увидеть ранжирование рейтинга рейтинга 7462. http://www.sendspace.com/file/pet0dd

Тогда для каждой 7 карт у вас будет 21 разный рейтинг из этой таблицы 7462, которую я сделал. Самый высокий рейтинг из 21 комбинации - это тот, который вы хотите знать.

Чтобы понять таблицу: в каждой строке у вас есть карточка 5 карт (Z для подходящих, Y не подходит), и у вас есть ее рейтинг. Это вам только нужно. Я даю вам таблицу и примерный алгоритм. На самом деле это не код. Это визуальный базовый формат, и я написал его сейчас. вероятно, не работает, но вы должны понимать. Код будет примерно таким:

'############### 1st: Define your hand, for example "2c2d2h2s3c3h3s" #############################################################################################

Dim mycard As New ArrayList

mycard(1).Add("2c")
mycard(2).Add("2d")
mycard(3).Add("2h")
mycard(4).Add("2s")
mycard(5).Add("3c")
mycard(6).Add("3h")
mycard(7).Add("3s")
mycard.Sort() '################# you need to sort in alphabeticall order to match it later with 7462 table #############################################



' ################## 2nd: Let´s transform it to every kind of 5 cards combinations (21). It will also preserve the alphabeticall order ##################################

Dim myHand5 As String = ""
Dim suited as String = ""
Dim ranking as Integer = 0
Dim myranking as Integer = 7462
Dim mystring as String = ""

For cicle1 = 0 to 2
     For cicle2 = cicle1 + 1 to 3
          For cicle3 = cicle3 + 1 to 4
               For cicle4 = cicle3 + 1 to 5
                    For cicle5 = cicle4 + 1 to 6
                         myhand5 = left(mycard(cicle1),1) & left(mycard(cicle2),1) & left(mycard(cicle3),1) & left(mycard(cicle4),1)  & left(mycard(cicle5),1)
                         suited = left(mycard(cicle1),2) & left(mycard(cicle2),2) & left(mycard(cicle3),2) & left(mycard(cicle4),2)  & left(mycard(cicle5),2)
                         if suited = "ccccc" or suited = "ddddd" or suited = "hhhhh" or suited = "sssss" then myhand5 = myhand5 & "Z" Else myhand5 = myhand5 & "Y"  
                          ranking = 0                              
                          FileOpen (1, "7462.txt", Input)
                          Do
                               ranking = ranking + 1
                               Input(1, mystring)
                               Input(1, ranking)
                               If mystring = myhand5 Then 
                                    If ranking < myranking then myrankin = ranking
                               End If
                          Loop Until EOF(1)
                          FileClose(1)
                    Next cicle5
               Next cicle4
          Next cicle3
     Next cicle2
Next cicle1

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

Примечание. Я не программист. Я хочу быть. Я понимаю некоторые визуальные базовые функции. Я знаю, как делать настоящие программы. Если алгоритм работает, оставьте комментарий. Если вы хотите, чтобы это было очень быстро, я не знаю, как это сделать. У меня есть сверхбыстрый алгоритм, который позволяет мне проверять (в реальном времени) мои шансы против любых противников на каждом этапе игры. Я пробовал много алгоритмов, чтобы рассчитать мои шансы на флопе в реальном времени, но самый быстрый, который я могу, составляет 30 секунд. Теперь я могу рассчитать свои коэффициенты на флопе за 3 секунды, но я использую базу данных 150 гигабайт со многими заранее рассчитанными параметрами. Если вы хотите узнать свои шансы в реальном времени, у вас должно быть много заранее рассчитанных. Вот как я это сделал.

Ответ 5

Я создал тестовый стенд для оценщиков покера в C здесь. Из тестируемых оценщиков победителем стала библиотека poker-eval. Steve Brecher Holdem Showdown также был довольно быстрым и имел значительно меньше требований к памяти. Мой собственный ACE_Eval сохранил его.

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

Ответ 6

Я разработал алгоритм для оценки рук с 7 картами без повторения всех 21 комбинации.

В принципе, он разделяет руку с 7 картами на две категории: флеш, а не флеш. Если это флеш, было бы легко найти значение в таблице из 8192 записей. Если это не флеш, он будет запускать хеш-функцию с помощью методов динамического программирования, а затем искать значение в хеш-таблице из 49205 записей.

Если вам интересно, проверьте мою работу в github.

https://github.com/HenryRLee/PokerHandEvaluator

Ответ 7

Я разработал симулятор Texas hold'em, и во время этого развития я нашел количество 7462 уникальных комбинаций (52-5/5 карт) на флопе. В свою очередь, это число падает до 6075 (5/6), а в реке - до 4824 (5/7). Это связано с тем, что 1 или 2 карты не имеют значения при классификации руки в покере. Пример: 76543QK = 7654332 прямой (от 3 до 7)

Мой симулятор называется Easy Poker и доступен на моем сайте http://crvltda.webs.com

Ref. Pokersoftware.com/forum

Ответ 8

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

Таблица7462 shoul находится в массиве, а не в файле.

Затем вы должны предварительно вычислить все разные руки 7cards и сохранить их в базе данных. Есть 133.784.560 различных комбинаций 7 карт.

Вы должны использовать этот формат (alphabeticall order):

"2c2d2h2s3c3d3h" и ранг it

Храните каждые 133.784.560 различных комбинаций. Вы делаете 52C7 cicles, ранжируйте его и храните в базе данных. Может быть, через несколько дней вы будете готовы. Когда вы его готовы, вам больше не нужны 21 комбинации, просто поместите свою руку в алфавитном порядке и найдите ее в своей базе данных.

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

Поверь мне. Я не программист, и я могу это сделать. Я знаю свои шансы на флопе за 3 секунды.