Looking for Poker Source Code
Hole Cards Equity Against 1 Random Hand Top % Equity Against 1 Random Hand AA 85,204% 0,45% KK 82,396% 0,90% QQ 79,925% 1,36% JJ 77,469% 1,81% TT 75,012% 2,26% 99 72,057% 2,71% 88 69,163% 3,17% 77 66,236% 3,92% 66 63,285% 8,30% 55 60,325% 13,88% 44 57,023% 25,19% 33 53,693% 35,60% 22 50,334% 48,11% AKs 67,045% 3,47% AQs 66,209% 4,22% AJs 65,393% 4,52% ATs 64,402% 6,64% A9s 62,781% 8,60% A8s 61,944% 10,11% A7s 60,984% 11,61% A6s 59,906% 15,08% A5s 59,923% 14,78% A4s 59,034% 17,50% A3s 58,220% 19,00% A2s 57,379% 23,83% KQs 63,400% 7,84% KJs 62,567% 9,80% KTs 61,789% 10,41% K9s 59,988% 14,48% K8s 58,312% 18,70% K7s 57,538% 23,23% K6s 56,641% 26,40% K5s 55,793% 28,81% K4s 54,885% 33,03% K3s 54,055% 34,54% K2s 53,212% 38,91% QJs 60,259% 14,18% QTs 59,468% 17,19% Q9s 57,664% 22,93% Q8s 56,018% 27,60% Q7s 54,302% 33,33% Q6s 53,613% 35,90% Q5s 52,769% 39,22% Q4s 51,855% 41,03% Q3s 51,019% 45,85% Q2s 50,169% 48,42% JTs 57,528% 23,53% J9s 55,662% 29,11% J8s 54,016% 35,14% J7s 52,325% 40,72% J6s 50,606% 46,76% J5s 49,987% 49,62% J4s 49,070% 52,94% J3s 48,232% 53,54% J2s 47,378% 58,07% T9s 54,028% 34,84% T8s 52,334% 39,52% T7s 50,639% 46,46% T6s 48,941% 53,24% T5s 47,216% 59,28% T4s 46,530% 60,48% T3s 45,693% 64,10% T2s 44,839% 66,52% 98s 50,801% 46,15% 97s 49,118% 52,64% 96s 47,428% 57,77% 95s 45,722% 63,80% 94s 43,862% 69,83% 93s 43,264% 71,34% 92s 42,415% 74,96% 87s 47,936% 55,66% 86s 46,243% 61,69% 85s 44,545% 66,82% 84s 42,702% 72,85% 83s 40,784% 78,88% 82s 40,272% 81,00% 76s 45,372% 64,40% 75s 43,676% 70,14% 74s 41,849% 76,17% 73s 40,036% 81,30% 72s 38,156% 87,03% 65s 43,133% 72,55% 64s 41,333% 78,58% 63s 39,534% 83,71% 62s 37,669% 89,44% 54s 41,453% 77,38% 53s 39,693% 83,41% 52s 37,849% 89,14% 43s 38,642% 85,82% 42s 36,289% 92,46% 32s 35,984% 95,48% AKo 65,320% 5,43% AQo 64,432% 6,33% AJo 63,563% 7,54% ATo 62,722% 9,50% A9o 60,773% 12,52% A8o 59,873% 15,99% A7o 58,841% 18,40% A6o 57,682% 22,62% A5o 57,697% 21,72% A4o 56,730% 26,09% A3o 55,845% 28,51% A2o 54,929% 32,73% KQo 61,546% 11,31% KJo 60,569% 13,42% KTo 59,739% 16,89% K9o 57,812% 20,81% K8o 56,020% 27,30% K7o 55,187% 31,83% K6o 54,223% 34,24% K5o 53,314% 37,71% K4o 52,327% 40,42% K3o 51,426% 44,65% K2o 50,509% 47,66% QJo 58,135% 19,91% QTo 57,291% 24,74% Q9o 55,360% 30,02% Q8o 53,600% 36,80% Q7o 51,766% 41,93% Q6o 51,024% 45,55% Q5o 50,120% 49,32% Q4o 49,128% 52,34% Q3o 48,219% 54,45% Q2o 47,295% 58,97% JTo 55,248% 30,92% J9o 53,251% 38,61% J8o 51,490% 43,74% J7o 49,682% 51,43% J6o 47,844% 57,47% J5o 47,181% 60,18% J4o 46,186% 62,59% J3o 45,276% 65,31% J2o 44,348% 68,63% T9o 51,532% 42,84% T8o 49,721% 50,53% T7o 47,908% 56,56% T6o 46,092% 63,50% T5o 44,251% 69,53% T4o 43,504% 71,04% T3o 42,595% 74,66% T2o 41,668% 77,07% 98o 48,097% 55,35% 97o 46,298% 61,39% 96o 44,491% 67,72% 95o 42,669% 73,76% 94o 40,671% 79,79% 93o 40,020% 82,20% 92o 39,098% 85,52% 87o 45,051% 66,21% 86o 43,241% 72,25% 85o 41,428% 78,28% 84o 39,447% 84,62% 83o 37,484% 90,35% 82o 36,828% 91,25% 76o 42,323% 75,87% 75o 40,512% 80,69% 74o 38,550% 86,73% 73o 36,602% 92,16% 72o 34,584% 96,38% 65o 39,944% 83,11% 64o 38,010% 88,84% 63o 36,078% 95,17% 62o 34,075% 98,19% 54o 38,155% 87,93% 53o 36,265% 93,36% 52o 34,285% 97,29% 43o 36,146% 94,27% 42o 33,200% 99,10% 32o 32,303% 100,00%
(2c/3c) Count=2097572400 Player1_wins=655103625 (0.3123) split_pot: 115502268 (0.0551) (2c/4c) Count=2097572400 Player1_wins=669055094 (0.3190) split_pot: 115584981 (0.0551) (2c/5c) Count=2097572400 Player1_wins=688160523 (0.3281) split_pot: 115639517 (0.0551) (2c/6c) Count=2097572400 Player1_wins=716500067 (0.3416) split_pot: 113283352 (0.0540) (2c/7c) Count=2097572400 Player1_wins=754355732 (0.3596) split_pot: 108551302 (0.0518) (2c/8c) Count=2097572400 Player1_wins=800864808 (0.3818) split_pot: 102381963 (0.0488) (2c/9c) Count=2097572400 Player1_wins=854560497 (0.4074) split_pot: 95792141 (0.0457) (2c/Tc) Count=2097572400 Player1_wins=914358108 (0.4359) split_pot: 89538228 (0.0427) (2c/Jc) Count=2097572400 Player1_wins=979521951 (0.4670) split_pot: 84068227 (0.0401) (2c/Qc) Count=2097572400 Player1_wins=1049703124 (0.5004) split_pot: 79534141 (0.0379) (2c/Kc) Count=2097572400 Player1_wins=1125134960 (0.5364) split_pot: 75668423 (0.0361) (2c/Ac) Count=2097572400 Player1_wins=1207321593 (0.5756) split_pot: 71307885 (0.0340) (3c/4c) Count=2097572400 Player1_wins=682297521 (0.3253) split_pot: 115602951 (0.0551) (3c/5c) Count=2097572400 Player1_wins=701405423 (0.3344) split_pot: 115646345 (0.0551) (3c/6c) Count=2097572400 Player1_wins=729742907 (0.3479) split_pot: 113267338 (0.0540) (3c/7c) Count=2097572400 Player1_wins=767582780 (0.3659) split_pot: 108512446 (0.0517) (3c/8c) Count=2097572400 Player1_wins=813981917 (0.3881) split_pot: 102320265 (0.0488) (3c/9c) Count=2097572400 Player1_wins=867645747 (0.4136) split_pot: 95706655 (0.0456) (3c/Tc) Count=2097572400 Player1_wins=927385230 (0.4421) split_pot: 89429900 (0.0426) (3c/Jc) Count=2097572400 Player1_wins=992477295 (0.4732) split_pot: 83937057 (0.0400) (3c/Qc) Count=2097572400 Player1_wins=1062573040 (0.5066) split_pot: 79380129 (0.0378) (3c/Kc) Count=2097572400 Player1_wins=1137905798 (0.5425) split_pot: 75491569 (0.0360) (3c/Ac) Count=2097572400 Player1_wins=1219979703 (0.5816) split_pot: 71108189 (0.0339) (4c/5c) Count=2097572400 Player1_wins=714650931 (0.3407) split_pot: 115609432 (0.0551) (4c/6c) Count=2097572400 Player1_wins=742979511 (0.3542) split_pot: 113218321 (0.0540) (4c/7c) Count=2097572400 Player1_wins=780804148 (0.3722) split_pot: 108443125 (0.0517) (4c/8c) Count=2097572400 Player1_wins=827176018 (0.3943) split_pot: 102230640 (0.0487) (4c/9c) Count=2097572400 Player1_wins=880729017 (0.4199) split_pot: 95596726 (0.0456) (4c/Tc) Count=2097572400 Player1_wins=940426927 (0.4483) split_pot: 89298721 (0.0426) (4c/Jc) Count=2097572400 Player1_wins=1005454449 (0.4793) split_pot: 83785574 (0.0399) (4c/Qc) Count=2097572400 Player1_wins=1075473702 (0.5127) split_pot: 79208342 (0.0378) (4c/Kc) Count=2097572400 Player1_wins=1150718019 (0.5486) split_pot: 75299478 (0.0359) (4c/Ac) Count=2097572400 Player1_wins=1232691534 (0.5877) split_pot: 70895794 (0.0338) (5c/6c) Count=2097572400 Player1_wins=759201839 (0.3619) split_pot: 111133753 (0.0530) (5c/7c) Count=2097572400 Player1_wins=797009131 (0.3800) split_pot: 106345957 (0.0507) (5c/8c) Count=2097572400 Player1_wins=843355991 (0.4021) split_pot: 100115706 (0.0477) (5c/9c) Count=2097572400 Player1_wins=896873650 (0.4276) split_pot: 93464026 (0.0446) (5c/Tc) Count=2097572400 Player1_wins=956464136 (0.4560) split_pot: 87148255 (0.0415) (5c/Jc) Count=2097572400 Player1_wins=1021443732 (0.4870) split_pot: 81616396 (0.0389) (5c/Qc) Count=2097572400 Player1_wins=1091395430 (0.5203) split_pot: 77021398 (0.0367) (5c/Kc) Count=2097572400 Player1_wins=1166561944 (0.5561) split_pot: 73094768 (0.0348) (5c/Ac) Count=2097572400 Player1_wins=1248447408 (0.5952) split_pot: 68673318 (0.0327) (6c/7c) Count=2097572400 Player1_wins=816884024 (0.3894) split_pot: 101948257 (0.0486) (6c/8c) Count=2097572400 Player1_wins=863207923 (0.4115) split_pot: 95705487 (0.0456) (6c/9c) Count=2097572400 Player1_wins=916694200 (0.4370) split_pot: 89038579 (0.0424) (6c/Tc) Count=2097572400 Player1_wins=976244675 (0.4654) split_pot: 82707580 (0.0394) (6c/Jc) Count=2097572400 Player1_wins=1041124559 (0.4963) split_pot: 77160493 (0.0368) (6c/Qc) Count=2097572400 Player1_wins=1111025338 (0.5297) split_pot: 72549321 (0.0346) (6c/Kc) Count=2097572400 Player1_wins=1186124687 (0.5655) split_pot: 68607463 (0.0327) (6c/Ac) Count=2097572400 Player1_wins=1267934439 (0.6045) split_pot: 64170785 (0.0306) (7c/8c) Count=2097572400 Player1_wins=886112517 (0.4224) split_pot: 89637179 (0.0427) (7c/9c) Count=2097572400 Player1_wins=939571847 (0.4479) split_pot: 82958527 (0.0395) (7c/Tc) Count=2097572400 Player1_wins=999089437 (0.4763) split_pot: 76614838 (0.0365) (7c/Jc) Count=2097572400 Player1_wins=1063929667 (0.5072) split_pot: 71055061 (0.0339) (7c/Qc) Count=2097572400 Player1_wins=1133744426 (0.5405) split_pot: 66431199 (0.0317) (7c/Kc) Count=2097572400 Player1_wins=1208794941 (0.5763) split_pot: 62475705 (0.0298) (7c/Ac) Count=2097572400 Player1_wins=1290543081 (0.6153) split_pot: 58026337 (0.0277) (8c/9c) Count=2097572400 Player1_wins=964432149 (0.4598) split_pot: 76160588 (0.0363) (8c/Tc) Count=2097572400 Player1_wins=1023922645 (0.4881) split_pot: 69806747 (0.0333) (8c/Jc) Count=2097572400 Player1_wins=1088730257 (0.5190) split_pot: 64236818 (0.0306) (8c/Qc) Count=2097572400 Player1_wins=1158507457 (0.5523) split_pot: 59602804 (0.0284) (8c/Kc) Count=2097572400 Player1_wins=1233488237 (0.5881) split_pot: 55637158 (0.0265) (8c/Ac) Count=2097572400 Player1_wins=1315191228 (0.6270) split_pot: 51176692 (0.0244) (9c/Tc) Count=2097572400 Player1_wins=1049667578 (0.5004) split_pot: 63114075 (0.0301) (9c/Jc) Count=2097572400 Player1_wins=1114447347 (0.5313) split_pot: 57536532 (0.0274) (9c/Qc) Count=2097572400 Player1_wins=1184195804 (0.5646) split_pot: 52894904 (0.0252) (9c/Kc) Count=2097572400 Player1_wins=1259144602 (0.6003) split_pot: 48921644 (0.0233) (9c/Ac) Count=2097572400 Player1_wins=1340798616 (0.6392) split_pot: 44453564 (0.0212) (Tc/Jc) Count=2097572400 Player1_wins=1140290604 (0.5436) split_pot: 51488971 (0.0245) (Tc/Qc) Count=2097572400 Player1_wins=1210016753 (0.5769) split_pot: 46842267 (0.0223) (Tc/Kc) Count=2097572400 Player1_wins=1284944085 (0.6126) split_pot: 42863931 (0.0204) (Tc/Ac) Count=2097572400 Player1_wins=1366575096 (0.6515) split_pot: 38390775 (0.0183) (Jc/Qc) Count=2097572400 Player1_wins=1235495104 (0.5890) split_pot: 41698627 (0.0199) (Jc/Kc) Count=2097572400 Player1_wins=1310409065 (0.6247) split_pot: 37717753 (0.0180) (Jc/Ac) Count=2097572400 Player1_wins=1392029289 (0.6636) split_pot: 33242059 (0.0158) (Qc/Kc) Count=2097572400 Player1_wins=1335161847 (0.6365) split_pot: 33680522 (0.0161) (Qc/Ac) Count=2097572400 Player1_wins=1416781039 (0.6754) split_pot: 29204828 (0.0139) (Kc/Ac) Count=2097572400 Player1_wins=1440041223 (0.6865) split_pot: 26853684 (0.0128)
// CONSTANTS: #define STRAIGHT_FLUSH 775892 #define FOUR_OF_A_KIND 775723 #define FULL_HOUSE 775554 #define FLUSH 404261 #define STRAIGHT 404248 #define THREE_OF_A_KIND 402051 #define TWO_PAIR 399854 #define ONE_PAIR 371293 #define HIGH_CARD 0 // POWERS of 13 #define TT0 1 #define TT1 13 #define TT2 169 #define TT3 2197 #define TT4 28561 #define TT5 371293 //POWERS of 13 multiplied by 0-12 const unsigned int tt0[13] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; const unsigned int tt1[13] = {0, 13, 26, 39, 52, 65, 78, 91, 104, 117, 130, 143, 156}; const unsigned int tt2[13] = {0, 169, 338, 507, 676, 845, 1014, 1183, 1352, 1521, 1690, 1859, 2028}; const unsigned int tt3[13] = {0, 2197, 4394, 6591,8788, 10985, 13182, 15379, 17576, 19773, 21970, 24167, 26364}; const unsigned int tt4[13] = {0, 28561, 57122, 85683, 114244, 142805, 171366, 199927, 228488, 257049, 285610, 314171, 342732}; const unsigned int tt5[13] = {0, 371293, 742586, 1113879, 1485172, 1856465, 2227758, 2599051, 2970344, 3341637, 3712930, 4084223, 4455516}; // The "Board" contains 5 "Card" objects. // The "Hand" contains 2 "Card" objects. // A card object's "value_" is an int from 0-51 // 0-12 are suit1 (clubs), 2-A // 13-25 are suit2, 2-A // etc... int rank(Board b1, Hand p1) { int suit[7]; int value[7]; int isFlush = 0; int isStraightFlush = 0; int isStraight = 0; int flushCards[7]; int flushSuit=-1; int straightHighCard=-1; int straightFlushHighCard=-1; int fourple = -1; int triple = -1; int pair[2]; pair[0] = -1; pair[1] = -1; //set values[] & suits[] value[0] = b1.board_[0].value_ % 13; value[1] = b1.board_[1].value_ % 13; value[2] = b1.board_[2].value_ % 13; value[3] = b1.board_[3].value_ % 13; value[4] = b1.board_[4].value_ % 13; value[5] = b1.board_[5].value_ % 13; value[6] = b1.board_[6].value_ % 13; suit[0] = b1.board_[0].value_ / 13; suit[1] = b1.board_[1].value_ / 13; suit[2] = b1.board_[2].value_ / 13; suit[3] = b1.board_[3].value_ / 13; suit[4] = b1.board_[4].value_ / 13; suit[5] = b1.board_[5].value_ / 13; suit[6] = b1.board_[6].value_ / 13; // sort by increasing values for (int i=0; i<6; i++) { for (int j=0; j<6-i; j++) { if (value[j+1] < value[j]) { int tmp1 = value[j]; int tmp2 = suit[j]; value[j] = value[j+1]; value[j+1] = tmp1; suit[j] = suit[j+1]; suit[j+1] = tmp2; } } } //get suit counts int a=0; int b=0; int c=0; int d=0; for (int i=0, j=0;i<7;i++) { if(suit[i] == 0) a++; else if(suit[i] == 1) b++; else if(suit[i] ==2) c++; else d++; } //check for a flush if(a>4) { flushSuit = 0; isFlush = 1; } else if ( b>4) { flushSuit = 1; isFlush = 1; } else if ( c>4) { flushSuit = 2; isFlush = 1; } else if (d>4) { flushSuit = 3; isFlush = 1; } else isFlush = 0; //check for a straight flush: if (isFlush) { for (int f=0; f<7; f++) { flushCards[f] = -1; } for (int x=0,y=6; y >= 0; y--) { if (suit[y] == flushSuit) { flushCards[x++] = value[y]; } } int straightFlushHistogram[13]; for (int f=0; f<13; f++) { straightFlushHistogram[f] = 0; } for (int g = 0; g < 7 && flushCards[g] != -1; g++) { straightFlushHistogram[flushCards[g]]++; } int straightFlushCount = 0; isStraightFlush = 0; for (int i = 0; i < 13; i++) { if(straightFlushHistogram[i]) { straightFlushCount++; if(straightFlushCount >= 5) { isStraightFlush = 1; straightFlushHighCard = i; } } else { straightFlushCount=0; } } } // straight flush: if (isStraightFlush) { return (STRAIGHT_FLUSH + straightFlushHighCard); } //check for a straight or 4 of a kind: int straightHistogram[13]; for(int i = 0; i <13; i++) straightHistogram[i] = 0; for(int i = 0; i <7; i++) { straightHistogram[value[i]]++; if(straightHistogram[value[i]] == 4) { fourple = value[i]; } } int straightCount = 0; isStraight = 0; for (int i = 0; i < 13; i++) { if(straightHistogram[i]) { straightCount++; if(straightCount >= 5) { isStraight = 1; straightHighCard = i; } } else straightCount=0; } // four of a kind: if (fourple != -1) { int kicker; int i = 7; while(value[--i] == fourple) {} kicker = value[i]; return (FOUR_OF_A_KIND + tt1[triple] + kicker); } //check for trips and pairs: else {//if(fourple == -1) for (int i = 12; i >= 0; i--) { if (straightHistogram[i] == 3) if (triple == -1) triple = i; else { // 2nd triple means no pairs possible, but full house definite. // so use high trip as the triple and the low trip as the pair for the full house. pair[0] = i; } else if (straightHistogram[i] == 2) { if( pair[0] == -1) pair[0] = i; else if (pair[1] == -1) pair[1] = i; } } } // full house: if(triple != -1 && pair[0] != -1) { return (FULL_HOUSE + tt1[triple] + pair[0]); } // flush: else if (isFlush) { return (FLUSH + tt4[flushCards[0]] + tt3[flushCards[1]] + tt2[flushCards[2]] + tt1[flushCards[3]] + flushCards[4]); } // three of a kind: if (triple != -1) { int kick1, kick2; int i = 6; while(value[i] == triple) {i--;} kick1 = value[i--]; while(value[i] == triple) {i--;} kick2 = value[i]; return (THREE_OF_A_KIND + tt2[triple] + tt1[kick1] + kick2); } // two pair: else if (pair[1] != -1) { int kick; int i = 6; while(value[i] == pair[0] || value[i] == pair[1]) {i--;} kick = value[i]; return (TWO_PAIR + tt2[pair[0]] + tt1[pair[1]] + kick); } // one pair: else if (pair[0] != -1) { int kick1; int kick2; int kick3; int i = 6; while(value[i] == pair[0]) {i--;} kick1 = value[i--]; while(value[i] == pair[0]) {i--;} kick2 = value[i--]; while(value[i] == pair[0]) {i--;} kick3 = value[i]; return (ONE_PAIR + tt3[pair[0]] + tt2[kick1] + tt1[kick2] + kick3); } // high card (no pair): else return (HIGH_CARD + tt4[value[6]] + tt3[value[5]] + tt2[value[4]] + tt1[value[3]] + value[2]); }