Soru 7 Kartlı Poker El Değerlendiricisi


7 kartlı poker eli değerlendirmek için hızlı bir algoritma bilen var mı? Basit bir kabadan daha etkili olan bir şey, her 21 5-kartlı bir el kombinasyonunu 7 setten kontrol ediyor.

Alkış,

Pete


32
2018-05-13 19:59


Menşei


İyi bir soru, ama bence çılgın hile kestirmeye çalışmak yerine 21 kombinasyonu kontrol etmek daha iyi. - David M
@David Aslında, hiçbir şey doğrudan başka bir şey olamaz. İnsanlar hızlı 7 kart değerlendiricisi yazmak için çok çaba sarf ettiler. Bir saniyede milyonlarca el yapmak istediğinizde, hız önemli hale gelir. - Nick Johnson
@David: Okuması daha kolay olan ve hiçbir şekilde HAYIR sıralama gerektirmeyen çok daha iyi yollar vardır. Onlar da bunun için daha fazla büyüklükte birkaç emirdir. Bir örnek - ahem - burada bulundu: code.google.com/p/specialkpokereval. - SK9
Java'da bir egzersiz olarak kendi kendime yazdım (bunun uğruna tekerleği yeniden icat etmek istedim). Belgelendi ve tarif ettiğin şey tam olarak bu. Çok fazla cevabınız var ama Java'da programlama yapıyorsanız, sizin için daha uygun olabilir. Bu yoruma cevap ver ve onu bağlayan yeni bir cevap oluşturacağım. Java değilse, sanırım zaten bağlantılı olanlardan daha ilginç olmayacağım. - DPM
Tüm 133 milyon 7-kartlı eli 5 saniyede kontrol eden bir java programı yazdım: codeproject.com/Articles/1068755/... Devam eden bir proje, bu yüzden daha da hızlı olacağına inanıyorum. - Albert Hendriks


Cevaplar:


Bu sitede bir grup liste var Poker El Değerlendiricisi kütüphaneleri ve her biri hakkında birkaç detay verir. Çoğu 5 kartlı eller içindir, ancak 7 kartlı el için en az bir tane vardır. Snezee7 Değerlendiricisi. Ayrıca site, poker ellerini hızlıca analiz etmek için kullanılan farklı teknikler ve algoritmalara genel bir bakış sunuyor.

Pokersource Değerlendiricisinin Keith Rule C # Port'unu birkaç farklı şekilde kullandım poker projeleri ve bunun mükemmel bir kütüphane olduğunu düşünün. Gerçekten hızlı el değerlendiricilerini yapmak için kullanabileceğiniz birçok akıllı numara vardır, ancak bu kodu yazmak çok fazla iş gerektirir ve varolan bir kütüphaneyi kullanmanızı şiddetle tavsiye ederim.


11
2018-05-13 20:25



Snezee7'nin 266 MB'lık bir arama tablosu gerektirdiğini unutmayın. - David M
Bu yapar ... ama hızlı bir el değerlendirici (çok sayıda ön hesaplama) nasıl elde edersiniz. Two Plus Two değerlendiricisi, 123 MB'lık bir arama tablosunu kullanarak 7 kartlı elleri değerlendirmek için benzer bir yaklaşım kullanır. 5 kartlı eller için arama tabloları çok daha küçüktür. - Greg Bray
utanmaz fiş - Yukarıdakilerin bazıları kadar hızlı olmasa da, burada hiç tablo kullanmadan ~ 70M el / s yapan bir tane var: github.com/ashelly/ACE_eval. - AShelly
@polarysekt Maalesef Tekerlek Kodlama web sitesi birkaç aydır düştü. Geri dönüp gelmediğinden emin değilsiniz, ancak şimdilik WayBack Makinesindeki her iki bağlantı için ayrıntıları bulabilirsiniz. web.archive.org/web/20140625212722/http://codingthewheel.com/... - Greg Bray
Başka bir fiş: lcrocker.github.io/onejoker/cardlib çeşitli diller için bağlamalar var. 5 kartlı bir değerlendirici herhangi bir öncekinden daha hızlıdır ve yedi kartlı bir değerlendirici en iyisi ile karşılaştırılabilir ve sadece 1Mb'lik tablo gerektirir. - Lee Daniel Crocker


Bir tane yazdım JavaScript. Çekirdek değerlendirme metodu sadece bit manipülasyonları kullanır, bu yüzden son derece hızlıdır. Bunu akılda tutarak, 21 kombinasyona bakmak hala çok hızlı. Derinleşmemiz gereken tek zaman, bir kravatın ortaya çıkmasıdır. Bu olduğunda, hangi 5 kartın aslında en iyi olduğunu görmek için daha fazla ayrıntıya bakmamız gerekiyor. İşte bulduğum çözüm:

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],  [ _[""], _[""], _[""], _[""], _[""] ] ); 

Burada açıklama
Burada demo


29
2017-11-09 20:59



Bu bir sürü çaba koymak! +1 :) - Tom Tu
O bir cadı! Harika bir yazı. - Evan Knowles
Bu kodda bir hata var - eğer düşük bir kart olarak bir Ace ile bir düzlüğünüz varsa (ör. A 2 3 4 5 6 K), yanlış bir şekilde alt Düz. Bu örnekte 6 yüksek düz en iyi olmalıdır. Bunun nedeni, Ace'e fazladan ağırlık vermesidir, ancak bu durumda, yüksek düz değil, daha düşük düz olduğu için bunu yapmak yanlıştır. görmek imgur.com/a/e9wGR - wal


Sorduğunuza sevindim :) Evet, işte sadece bilet olabilecek yepyeni bir çözüm:

Kod: http://code.google.com/p/specialkpokereval/
Blog: http://specialk-coding.blogspot.com/2010/04/texas-holdem-7-card-evaluator_23.html

Bu değerlendiricinin ticari aşamalı bir evrimi iPhone / iPod Touch için iTunes Store üzerinden kullanılabilir. Adı "Poker Ası".

James Devlin'in blogunda, linklerle tamamlanan çeşitli çözümlerin mükemmel bir özeti bulunur.Tekerlek Kodlama".

Henüz tartışılmamış bir değerlendirici var. Klaatu adlı.

İyi şanslar!


7
2018-03-06 13:06



Değerlendiricinizi ekledim. hesabı yuvarlamak. Herhangi bir geri bildirim için teşekkür ederiz. - AShelly


Tüm 21 kombinasyonu tekrar etmeden 7-kart el değerlendirmesi için bir algoritma geliştirdim.

Temel olarak, 7-kartlı elini iki kategoriye ayırır: yıkama ve bir deşarj değil. Eğer bir floş ise, değeri 8192 girişindeki bir tabloya bakmak kolay olurdu. Bir floş değilse, dinamik programlama teknikleriyle bir karma fonksiyonu çalıştırır ve ardından değeri 49205 girişlerinin bir karma tablosunda arar.

Eğer ilgilenirseniz, lütfen işimi github'da kontrol edin.

https://github.com/HenryRLee/PokerHandEvaluator


4
2017-11-21 03:57



Değerlendirici, eğer her zaman (13) ve her zaman (7) düzlemenin her zaman (7) olması ve daha sonra ortalama% 15 daha fazla tasarruf sağladığı için, (daha önce de olsa), daha önce değil de, daha önce yapılır. - Siddharth Chabra
@SiddharthChabra İyi fikir. İpuçları için teşekkürler. İsterseniz çekme talebinde bulunabilirsiniz. - HenryLee


Bence 21 kombinasyon yapmalı ve bir çeşit 7462 masayı kullanmalısın. 1: herhangi 7 kart 21 farklı 5 kart kombinasyonları var 2: Her olası son poker eli (2.598.960) 7462 farklı türde elden birini temsil ediyor yani, kolay.

Kartlarınızın her 21 kombinasyonuna bakmak zorundasınız ve her biri için 7462 sıralama tablosunun sıralamasını görmelisiniz. http://www.sendspace.com/file/pet0dd

Daha sonra, her 7 kart için yaptığınız bu 7462 tablodan 21 farklı sıralamaya sahip olacaksınız. 21 kombinasyonun en yüksek sıralaması bilmek istediğinizdir.

Tabloyu anlamak için: Her satırda 5 kartlı eliniz var (Z için uygun, Y uygun değil) ve sıralamanız var. Bu sadece ihtiyacın var. Sana masa ve örnek bir algoritma veriyorum. Bu gerçekten kod değil. Görsel temel format ve şimdi yazdım. Muhtemelen işe yaramıyor ama anlamalısın. Kod şöyle bir şey olurdu:

'############### 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

Son sıralama benim değişkenim. Elini bir saniyeden daha kısa sürede bilmelisin. Ve aynı zamanda diğer ellerle karşılaştırmak iyidir, çünkü sıralama değerine sahip değilsiniz. Ve eğer poker algoritmaları ile bir şeyler yapmak istiyorsanız, başlangıç ​​noktası burasıdır. Sıralama değerleri ile her şey hızlı ve kolaydır.

Not: Ben bir programcı değilim. Ben olmak istiyorum. Bazı görsel temel fonksiyonları anlıyorum. Gerçek programları nasıl yapacağımı biliyordum. Algoritma çalışırsa, lütfen yorum bırakın. Çok hızlı olmasını istiyorsanız, nasıl yapacağımı bilmiyorum. Ben oyunun her aşamasında herhangi bir rakibe karşı benim bahisleri (gerçek zamanlı) kontrol etmemi sağlayan ultra hızlı bir algoritma var. Flop'taki oranımı gerçek zamanlı olarak hesaplamak için birçok algoritmayı denedim ama en hızlısı 30 saniyedir. Şimdi, 3 saniyede flop'taki oranımı hesaplayabilirim ama önceden hesaplanmış birçok şeyle 150 gigabaytlık bir veritabanı kullanıyorum. Oranlarınızı gerçek zamanlı olarak bilmek istiyorsanız, önceden hesaplanmış birçok şeyiniz olmalıdır. Ben öyle yaptım.


2
2018-05-18 01:50





C'deki poker değerlendiricileri için bir test yatağı oluşturdum. İşte. Test ettiğim değerlendiricilerin poker eval kütüphane kazanan oldu. Steve Brecher'ın Holdem Şovu ayrıca oldukça hızlıydı ve önemli ölçüde daha az bellek gereksinimi vardı. Benim kendi ACE_Eval kendi tuttu.

Diğer değerlendiricilerin eklenmesine yardımcı olmak ve diğer makinelerin test sonuçlarının katkılarını memnuniyetle karşılıyorum.


2
2018-01-21 22:49



Steve Brecher'in değerlendiricisine iyi bir bakış atmıştım, ancak 0x0V0RRRRR sonucundan kart değerlerini çıkarmakta zorlanıyorum. Kriterlerinizin BHS bölümünde daha ayrıntılı bir kod çözücü ekleyebilir misiniz? - JSON
Buna ulaşmaya çalışacağım, ama bu arada: 5 'R' nibbles var, nerede 0..C '2' yi temsil eder .. 'Ace'. El sıralamasını oluşturan kartların değerlerini temsil ederler. Firar 0göz ardı edilir. Kaç değerin çıkarılacağını belirlemek için sıraya bakmanız gerekir. Yani 7 kicker ile 4 Aces için olurdu C5000. 3 yaş üstü bir Full House Kings için B1000 . Kraliçe kicker ile iki çift, 8s ve 4s 62A00. Ve benzeri. Yüksek Kartlı bir el, tüm 5 nibbles kullanırdı. ACE_Eval.h benzer bir temsil kullanmaktadır. Görmek ACE_decode() kazanan kartları almak için tek yol. - AShelly


Texas Hold'em simülatörü geliştirdim ve bu geliştirme sırasında flopta 7462 benzersiz kombinasyon (52 - 5/5 kart) buldu. Buna karşılık, bu sayı 6075 (5/6) ve nehirde 4824'e (5/7) düşer. Bunun nedeni, poker elinin sınıflandırılmasında 1 veya 2 kartın alakasız olmasıdır. Bir örnek: 76543QK = 7654332 a düz (3 ila 7)

Simülatörüme Easy Poker denir ve sitemde kullanılabilir http://crvltda.webs.com

Ref. Pokersoftware.com/forum


0
2017-07-04 02:25





Tavsiye edebilirim https://github.com/chenosaurus/poker-evaluator/

JavaScript ile yazılmıştır ve 128 MB HandRanks.dat dosyası kullanmaktadır.

Kod sadece birkaç satırdır ve başka bir dile bağlantı yapmak çok kolaydır.


0
2017-11-21 04:23





Tabii ki, çok hızlı yapmak istiyorsan. Daha önce koyduğum algoritma çok yavaş.

Table7462 shoul bir dizide, bir dosyada değil.

Daha sonra, her farklı 7 kart elinizi önceden hesaplamalı ve bir veritabanına saklamanız gerekir. 133.784.560 farklı 7cards kombinasyonu vardır.

Bu biçimi kullanmalısınız (alfabetik sırayla):

"2c2d2h2s3c3d3h" ve sırala

Her 133.784.560 farklı kombinasyonları saklayın. 52C7 cicles yapar, sıralar ve bir veritabanında saklarsınız. Belki birkaç gün içinde hazır olursun. Hazır olduğunuzda, artık 21 kombinasyona ihtiyacınız yok, elinizi alfabetik olarak sıralayın ve veritabanınızda arayın.

Bunu yaparsanız, ihtiyacınız olduğunda rakiplerinize karşı gerçek zamanlı olarak şansınızı hesaplayabileceğinizi göreceksiniz.

İnan bana. Ben programcı değilim ve yapabilirim. Flop'taki oranımı 3 saniyede biliyorum.


-1