Two Plus Two Newer Archives  

Go Back   Two Plus Two Newer Archives > Internet Gambling > Software
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #171  
Old 01-14-2007, 04:32 PM
RayW RayW is offline
Junior Member
 
Join Date: Mar 2005
Posts: 24
Default Re: 7 Card Hand Evaluators

Hi Mark,

I am running your code in Java. It worked fine.... No rank problems as I mentioned (put the rank > 12 code in as above and see if you hit that line). I didn't hit it. Also you need the heap memory increase (I am sure you had that!!). I didn't see anything wrong, and it came through cleanly (including rank). Let me know how you do...

Ray...
Reply With Quote
  #172  
Old 01-14-2007, 04:34 PM
mark007 mark007 is offline
Junior Member
 
Join Date: Jan 2007
Posts: 12
Default Re: 7 Card Hand Evaluators

Thanks Ray, I don't know where I am going wrong so.... I actually had that line in my code and it is never hit either, yet my 7 card evaluator blows up. Ill have a fiddle around but its strange it works fine for you [img]/images/graemlins/smile.gif[/img]
Reply With Quote
  #173  
Old 01-14-2007, 04:51 PM
mark007 mark007 is offline
Junior Member
 
Join Date: Jan 2007
Posts: 12
Default Re: 7 Card Hand Evaluators

Just before the switch statement where the eval's are done, I added the following lines. This shows that one of the workcards being sent to my evaluator has a rank of >12. I don't know whats going on now...

My code gets the out of bounds first in the 7 card evaluator, and with 7 card evals commented out, the 6 card evaluator goes out of bounds soon afterwards.
<font class="small">Code:</font><hr /><pre>
for (int cardNo=0; cardNo&lt;5; cardNo++)
{
if (((workcards[cardNo]&gt;&gt;&gt;8)&amp; 0xF) &gt; 12)
{
System.out.println("WOOPS, this cards rank was above 12");
System.exit(0);
}
}

switch (numevalcards) { // run Cactus Keys routines
case 5 : holdrank = eval_5cards(workcards[0],workcards[1],workcards[2],workcards[3],workcards[4]);
</pre><hr />
Reply With Quote
  #174  
Old 01-14-2007, 06:27 PM
RayW RayW is offline
Junior Member
 
Join Date: Mar 2005
Posts: 24
Default Re: 7 Card Hand Evaluators

Hi EVERYONE!!!

I did have a bug in the program in the DoEval Routine!!!

Please change the line at the top of the routine:
int suititerator = 0;

to

int suititerator = 1;

This should eliminate your problem with Java... For the C People out there... You should change this line in your code, but it didn't make a difference in the C routines because the only thing that this affected is the 0s for suit coming into the high bit of the rank. Suit didn't matter on these (because of the 0 suit), and if you don't have a suited hand it works off the prime numbers (not the rank &gt;&gt; 8). Interesting hit though, to be safe please rerun your Setup Programs...

Ray...
Reply With Quote
  #175  
Old 01-14-2007, 06:59 PM
mark007 mark007 is offline
Junior Member
 
Join Date: Jan 2007
Posts: 12
Default Re: 7 Card Hand Evaluators

Sweet, that fixed my problems [img]/images/graemlins/smile.gif[/img] Here is the output and thanks alot for the efforts.

Getting Card IDs!
Setting HandRanks!
maxHR = 612977 32487833
Training time: 44.813 seconds
Starting Test
0
23294460
58627800
31433400
6461620
6180020
4047644
3473184
224848
41584

Total Hands = 133784560
0.783 seconds
Reply With Quote
  #176  
Old 01-15-2007, 02:35 AM
rvg72 rvg72 is offline
Senior Member
 
Join Date: Jun 2005
Location: Canada
Posts: 2,342
Default Re: 7 Card Hand Evaluators

Anyone ever post the .NET version? I'd love to take a look at that.

rvg
Reply With Quote
  #177  
Old 01-17-2007, 12:15 PM
thomash thomash is offline
Junior Member
 
Join Date: Jan 2007
Posts: 3
Default Re: 7 Card Hand Evaluators

I am thinking of not storing an integer hand rank in the table but storing the actual effective hand strength. With effective hand strength I mean the probability that this hand will win the game if it comes to showdown. I start by generating the effective hand strengths for the 7-card combinations and then work my way backwards so I've got tables for 6,5 and 2 cards.

Has anyone tried this so far?

Thomas
Reply With Quote
  #178  
Old 01-17-2007, 01:30 PM
Grunch Grunch is offline
Senior Member
 
Join Date: Aug 2004
Posts: 9,623
Default Re: 7 Card Hand Evaluators

Just can't resist... [img]/images/graemlins/smile.gif[/img]

My code isn't like any of yours I don't think. My goal wasn't to write a fast evaluator, necesarrily, but to see if I could figure out how to evaluate a 7-card holdem hand with logic &amp; no lookup tables. So that's what I did. Its not fast, but it does what I wanted. Just a different approach.

<font class="small">Code:</font><hr /><pre>
#include "stdafx.h"
#include "score.h"
#include &lt;set&gt;
#include &lt;vector&gt;



static const size_t sic = 0, sis = 1, sih = 2, sid = 3;
static const size_t ria = 0, rik = 1, riq = 2, rij = 3, rit = 4, ri9 = 5, ri8 = 6, ri7 = 7, ri6 = 8, ri5 = 9, ri4 = 10, ri3 = 11, ri2 = 12;

struct matrix
{
// running totals of each suit
typedef std:air&lt;int,int&gt; suit_ttl; // first = total cards of this suit, second = high card in this suit
suit_ttl suit_ttls[4];

// running totals of each rank
typedef int rank_ttl;
rank_ttl rank_ttls[13];

// table card matrix
struct col
{
bool suit[4];
bool rank[13];
};
col board[7];
};

void BuildHEMatrix(card cards[7], bool suit[4][7], bool rank[13][7])
{
for( int i = 0; i &lt; 7; ++i )
{
suit[cards[i].suit][i] = true;
rank[cards[i].rank][i] = true;
}
}

inline handval BuildScore(int mask, int a, int b, int c, int d, int e)
{
handval ret = a;

ret &lt;&lt;= 4;
ret |= b;

ret &lt;&lt;= 4;
ret |= c;

ret &lt;&lt;= 4;
ret |= d;

ret &lt;&lt;= 4;
ret |= e | mask;

return ret;
}

handval ScoreHE(const card cards[7])
{
// build the card matrix
int flush_ttl[4] = {0};
int flush_hicard[4] = {0};
// int flush_locard[4] = {13};
int rank_ttl[13] = {0};

bool card_matrix[13][4] = {false};

for( int i = 0; i &lt; 7; ++i )
{
const card&amp; c = cards[i];
card_matrix[c.rank][c.suit] = true;

++flush_ttl[c.suit];
if( c.rank &gt; flush_hicard[c.suit] ) flush_hicard[c.suit] = c.rank;
// if( c.rank &lt; flush_locard[c.suit] ) flush_locard[c.suit] = c.rank;
++rank_ttl[c.rank];
}

// look for straight flush
for(int s = 0; s &lt; 4; ++s )
{
int remain = flush_ttl[s];
int run = 0;
int sf_rank = -1;

for( int r = flush_hicard[s]; run &lt; 5 &amp;&amp; r &lt;= 12 &amp;&amp; (remain+run)&gt;=5; --r, --remain )
{
if( card_matrix[r][s] )
{
if( ++run == 1 ) sf_rank = r;
}
else run = 0;
}

if( 5 == run ) return BuildScore(hipk_sflush, sf_rank, sf_rank-1, sf_rank-2, sf_rank-3, sf_rank-4 ); // we found a straight flush
}

// look for quads, trips, pairs etc
int quads_rank = -1,
trips_rank = -1,
twpr_rank = -1,
pr_rank = -1,
str_rank = -1,
str_run = 0;

for( int r = 12; r &gt;= 0; --r )
{
if( quads_rank == -1 &amp;&amp; rank_ttl[r] == 4 ) quads_rank = r;
if( trips_rank == -1 &amp;&amp; rank_ttl[r] == 3 ) trips_rank = r;
if( twpr_rank == -1 &amp;&amp; rank_ttl[r] == 2 )
{
if( pr_rank == -1 ) pr_rank = r;
else
{
if( pr_rank &gt; r )
{
twpr_rank = pr_rank;
pr_rank = r;
}
else
twpr_rank = r;
}
}
if( str_rank == -1 )
{
if( rank_ttl[r] == 0 ) str_run = 0;
else if( ++str_run == 5 ) str_rank = r+4;
}
}

// score quads
if( quads_rank &gt; -1 )
{
int kick = -1;
for( int r = 12; r &gt;= 0 &amp;&amp; -1 == kick; --r ) if( rank_ttl[r] &gt; 0 &amp;&amp; rank_ttl[r] != 4 ) kick = r; // find kicker
return BuildScore(hipk_quads, quads_rank, quads_rank, quads_rank, quads_rank, kick);
}

// score boat
if( trips_rank != -1 &amp;&amp; pr_rank != -1 )
{
if( twpr_rank != -1 ) return BuildScore(hipk_boat, trips_rank, trips_rank, trips_rank, twpr_rank, twpr_rank);
else return BuildScore(hipk_boat, trips_rank, trips_rank, trips_rank, pr_rank, pr_rank);
}

// score flush
for( int s = 0; s &lt; 4; ++s )
{
if( flush_ttl[s] &lt; 5 ) continue;
std::vector&lt;int&gt; fc;
for( int r = flush_hicard[s]; r &gt;=0 &amp;&amp; fc.size() &lt; 5; --r )
{
if( card_matrix[r][s] ) fc.push_back(r);
}
return BuildScore(hipk_flush, fc[0], fc[1], fc[2], fc[3], fc[4]);
}

// score straight
if( str_rank != -1 ) return BuildScore(hipk_straight, str_rank, str_rank-1, str_rank-2, str_rank-3, str_rank-4);

// score trips
if( trips_rank != -1 )
{
std::vector&lt;int&gt; kickers;
for( int r = 12; r &gt;= 0 &amp;&amp; kickers.size() &lt; 2; --r )
{
if( r != trips_rank &amp;&amp; rank_ttl[r] &gt; 0 ) kickers.push_back(r);
}
return BuildScore(hipk_trips, trips_rank, trips_rank, trips_rank, kickers[0], kickers[1]);
}

// score two pair
if( twpr_rank != -1 )
{
int kick = -1;
for( int r = 12; r &gt;= 0 &amp;&amp; -1 == kick; --r )
if( r != twpr_rank &amp;&amp; r != pr_rank &amp;&amp; rank_ttl[r] &gt; 0 )
kick = r; // find kicker
return BuildScore(hipk_2pr, twpr_rank, twpr_rank, pr_rank, pr_rank, kick);
}

// score pair
if( pr_rank != -1 )
{
std::vector&lt;int&gt; kicks;
for( int r = 12; r &gt;= 0 &amp;&amp; kicks.size() &lt; 3; --r )
if( rank_ttl[r] == 1 ) kicks.push_back(r); // find 3 kickers
return BuildScore(hipk_1pr, pr_rank, pr_rank, kicks[2], kicks[1], kicks[0]);
}

// score hi cards
std::vector&lt;int&gt; kicks;
for( int r = 12; r &gt;= 0 &amp;&amp; kicks.size() &lt; 5; --r )
if( rank_ttl[r] &gt; 0 ) kicks.push_back(r);
return BuildScore(hipk_hicard, kicks[4], kicks[3], kicks[2], kicks[1], kicks[0]);
}

</pre><hr />
Reply With Quote
  #179  
Old 01-17-2007, 01:42 PM
Grunch Grunch is offline
Senior Member
 
Join Date: Aug 2004
Posts: 9,623
Default Re: 7 Card Hand Evaluators

here's a test harness:

<font class="small">Code:</font><hr /><pre>
/***
John Dibling
johndotdiblingatsungarddotcom

***/

#include "stdafx.h"
#include "score.h"
#include &lt;algorithm&gt;
#include &lt;time.h&gt;
#include &lt;string&gt;
#include &lt;iostream&gt;
//#include "x:\utils\stlext\stringext.h"
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;list&gt;
#include &lt;cstdarg&gt;
#include &lt;ctype.h&gt;


/***

NOTE : The following functions in namespace std are from my STL Extensions library.
Only the necesarry code has been copied out of the STXEXT library and pasted here.

***/

namespace std
{
/* ---

Formatted Print

template&lt;class C&gt;
int strprintf(basic_string&lt;C&gt;* pString, const C* pFmt, ...);

template&lt;class C&gt;
int vstrprintf(basic_string&lt;C&gt;* pString, const C* pFmt, va_list args);

Returns :

# characters printed to output


Effects :

Writes formatted data to a string. strprintf() works exactly the same as sprintf(); see your
documentation for sprintf() for details of peration. vstrprintf() also works the same as sprintf(),
but instead of accepting a variable paramater list it accepts a va_list argument.

Requires :

pString is a pointer to a basic_string&lt;&gt;

--- */

inline int vstrprintf(string* pString, const char* pFmt, va_list args)
{
// prologue
static const size_t ChunkSize = 1024;
int retval = 0;
// get local work buffer
size_t nBufSize = 0;
char* pBuf = 0;
// format up string
int i = -1;
for( ; i == -1; )
{
// realloc local buffer
if( pBuf )
delete pBuf;
pBuf = new char[nBufSize+=ChunkSize];
// try to sprintf
i = _vsnprintf(pBuf,nBufSize,pFmt,args);
}
retval = i;
// epilogue
pString-&gt;assign(pBuf,retval);
delete pBuf;
return retval;
};

/* ---

Inline Formatted Print

string strprintf(const char* Format, ...);

Returns :

Formatted string


Effects :

Writes formatted data to a string. formatstr() works the same as sprintf(); see your
documentation for sprintf() for details of operation.

--- */

std::string formatstr(const char * fmt, ...)
{
std::string ret;

va_list args;
va_start(args, fmt);
int retval = vstrprintf(&amp;ret, fmt, args);
va_end(args);
return ret;
}

}; // namespace std


void deal_cards(card * deck, size_t n)
{
static bool seeded = false;
if( !seeded )
{
srand((unsigned)time(0));
seeded = true;
}

for( size_t i = 0; i &lt; n; ++i )
{
for( bool cont = true; cont; )
{
deck[i].rank = (cardrank)int(((double)rand()/(double)RAND_MAX) * 12);
deck[i].suit = (cardsuit)int( 3*((double)rand()/(double)RAND_MAX) );
cont = &amp;deck[i] != std::find(&amp;deck[0],&amp;deck[i],deck[i]);
}
}
}

std::string card_abbrev(const card&amp; c, bool incl_suit)
{
std::string ret;
static const char suitc[] = "cshd";
static const char rankc[] = "23456789TJQKA";
ret += rankc[c.rank];
if( incl_suit ) ret += suitc[c.suit];
return ret;
}

std::string print_hand(card* first, card* last)
{
std::string ret;
for( card* it = first; it != last; ++it )
{
if( it != first ) ret += " ";
ret += card_abbrev(*it,true);
}
return ret;
}

std::string rank_name(int rank)
{
switch( rank )
{
case 12 : return "Ace";
case 11 : return "King";
case 10 : return "Queen";
case 9 : return "Jack";
case 8 : return "Ten";
case 7 : return "Nine";
case 6 : return "Eight";
case 5 : return "Seven";
case 4 : return "Six";
case 3 : return "Five";
case 2 : return "Four";
case 1 : return "Trey";
case 0 : return "Deuce";
default : return "Bug";
}
}

std::string suit_name(cardsuit s)
{
switch( s )
{
case club : return "Clubs";
case spade : return "Spades";
case diamond : return "Diamonds";
case heart : return "Hearts";
default : return "Wands";
}
}

std::string card_name(card c)
{
return std::formatstr("%s of %s", rank_name(c.rank).c_str(), suit_name(c.suit).c_str());
}

std::string card_name(int r, cardsuit s)
{
return std::formatstr("%s of %s", rank_name(r).c_str(), suit_name(s).c_str());
}

std::string score2string(const handval&amp; val)
{
switch( val &amp; 0xF0000000 )
{
case hipk_sflush :
if( (0xf &amp; (val &gt;&gt; 16)) == 12 ) return "Royal Flush";
else return std::formatstr("Straight Flush, %s High",
rank_name((0xf &amp; (val &gt;&gt; 16))).c_str());
case hipk_quads:
return std::formatstr("Four of a Kind, %ss (%s Kicker)",
rank_name((0xf &amp; (val &gt;&gt; 16))).c_str(),
rank_name((0xf &amp; val)).c_str());
case hipk_boat :
return std::formatstr("Full House, %ss Full of %ss",
rank_name((0xf &amp; (val &gt;&gt; 16))).c_str(),
rank_name((0xf &amp; val)).c_str());
case hipk_flush :
return std::formatstr("Flush, %s-high",
rank_name((0xf &amp; (val &gt;&gt; 16))).c_str());
case hipk_straight :
return std::formatstr("Straight, %s-high",
rank_name((0xf &amp; (val &gt;&gt; 16))).c_str());
case hipk_trips :
return std::formatstr("Three of a Kind, %ss (%s-%s Kickers)",
rank_name((0xf &amp; (val &gt;&gt; 16))).c_str(),
rank_name((0xf &amp; (val &gt;&gt; 4))).c_str(),
rank_name((0xf &amp; val)).c_str());
case hipk_2pr :
return std::formatstr("Two Pair, %ss over %ss (%s Kicker)",
rank_name((0xf &amp; (val &gt;&gt; 16))).c_str(),
rank_name((0xf &amp; (val &gt;&gt; 8))).c_str(),
rank_name((0xf &amp; val)).c_str());
case hipk_1pr :
return std::formatstr("One Pair, %ss (%s-%s-%s Kickers)",
rank_name((0xf &amp; (val &gt;&gt; 16))).c_str(),
rank_name((0xf &amp; (val &gt;&gt; 8))).c_str(),
rank_name((0xf &amp; (val &gt;&gt; 4))).c_str(),
rank_name((0xf &amp; val)).c_str());
case hipk_hicard :
return std::formatstr("High Card, %s-%s-%s-%s-%s",
rank_name((0xf &amp; (val &gt;&gt; 16))).c_str(),
rank_name((0xf &amp; (val &gt;&gt; 12))).c_str(),
rank_name((0xf &amp; (val &gt;&gt; 8))).c_str(),
rank_name((0xf &amp; (val &gt;&gt; 4))).c_str(),
rank_name((0xf &amp; val)).c_str());

default : return "Something Wierd!";
}
}

struct deal_block
{
card deal[7];
deal_block(card in[7]) { std::copy(&amp;in[0], &amp;in[7], &amp;deal[0]); }
};

int _tmain(int argc, _TCHAR* argv[])
{
card exp[] = {
{club,7}, {club,6}, {club,5}, {club,4}, {club,3}, {club,2}, {club,1}, // sf
{club,7}, {spade,10}, {club,5}, {heart,10}, {diamond,10}, {club,2}, {club,10},// quads
{heart,12}, {heart,11}, {diamond,11}, {diamond,12}, {spade,12}, {club,3}, {club,2}, // full house
{club,7}, {club,6}, {club,9}, {club,4}, {club,3}, {club,2}, {club,1},// flush
{club,7}, {heart,6}, {spade,5}, {diamond,4}, {club,3}, {club,2}, {club,1},// straight
{heart,12}, {heart,11}, {diamond,11}, {diamond,11}, {spade,9}, {club,3}, {club,2},// trips
{heart,12}, {heart,11}, {diamond,11}, {diamond,12}, {spade,9}, {club,3}, {club,2},//2pair
{heart,12}, {heart,11}, {diamond,10}, {diamond,9}, {spade,7}, {club,3}, {club,2},// pair
{heart,12}, {heart,11}, {diamond,10}, {diamond,9}, {spade,7}, {club,3}, {club,2}, // high card
};

size_t deals = (sizeof(exp)/sizeof(exp[0]))/7;
for( size_t i = 0; i &lt; deals; ++i )
{
size_t ii = 7*i;
handval hv = ScoreHE(&amp;exp[ii]);
std::cout &lt;&lt; print_hand(&amp;exp[ii], &amp;exp[ii+7]).c_str() &lt;&lt; " -- " &lt;&lt; score2string(hv).c_str() &lt;&lt; std::endl;
}

for( size_t i = 0; i &lt; deals; ++i )
{
size_t ii = 7*i;
card shuffled[7];
std::copy(&amp;exp[ii], &amp;exp[ii+7], shuffled);
std::random_shuffle(&amp;shuffled[0], &amp;shuffled[7]);
handval hv = ScoreHE(shuffled);
std::cout &lt;&lt; print_hand(shuffled, &amp;shuffled[7]).c_str() &lt;&lt; " -- " &lt;&lt; score2string(hv).c_str() &lt;&lt; std::endl;
}
for( int i = 0; i &lt; 10; ++i )
{
card a[7];
size_t na = sizeof(a)/sizeof(a[0]);
deal_cards(a,na);
std::cout &lt;&lt; "[" &lt;&lt; i+1 &lt;&lt; "] : ";
for( size_t j = 0; j &lt; na; ++j ) std::cout &lt;&lt; card_abbrev(a[j],true).c_str() &lt;&lt; " ";
std::cout &lt;&lt; std::endl;
ScoreHE(a);
}

// time 1 million scores
#ifdef _DEBUG
const int trials = 200;
#else
const int trials = 10000000;
#endif
std::cout &lt;&lt; "Dealing " &lt;&lt; trials &lt;&lt; " games..." &lt;&lt; std::endl;
std::vector&lt;deal_block&gt; bigdeal;
bigdeal.reserve(trials);
card deal[7];
for( int i = 1; i &lt;= trials; ++i )
{
if( i%(trials/10) == 0 )
std::cout &lt;&lt; ".";
deal_cards(deal,7);
bigdeal.push_back(deal);
}

std::cout &lt;&lt; std::endl &lt;&lt; "Scoring games..." &lt;&lt; std::endl;

unsigned long results[9] = {0};
time_t start = time(0);
handval hv;
for( int i = 0; i &lt; trials; ++i )
{
if( i%(trials/10) == 0 )
std::cout &lt;&lt; ".";
hv = ScoreHE(bigdeal.at(i).deal);
++results[hv&gt;&gt;28];
}
time_t end = time(0);

std::cout &lt;&lt; std::endl &lt;&lt; "Elapsed Time: " &lt;&lt; (long)end-start;
if( (end-start)&gt;0 ) std::cout &lt;&lt; ", Scores per second: " &lt;&lt; trials/((long)end-start);
std::cout &lt;&lt; std::endl &lt;&lt; "Results:" &lt;&lt; std::endl
&lt;&lt; "S-Flushes: " &lt;&lt; results[8] &lt;&lt; "\t (" &lt;&lt; 100*results[8]/trials &lt;&lt; "%)" &lt;&lt; std::endl
&lt;&lt; "Quads: " &lt;&lt; results[7] &lt;&lt; "\t (" &lt;&lt; 100*results[7]/trials &lt;&lt; "%)" &lt;&lt; std::endl
&lt;&lt; "Full Boats: " &lt;&lt; results[6] &lt;&lt; "\t (" &lt;&lt; 100*results[6]/trials &lt;&lt; "%)" &lt;&lt; std::endl
&lt;&lt; "Flushes: " &lt;&lt; results[5] &lt;&lt; "\t (" &lt;&lt; 100*results[5]/trials &lt;&lt; "%)" &lt;&lt; std::endl
&lt;&lt; "Straights: " &lt;&lt; results[4] &lt;&lt; "\t (" &lt;&lt; 100*results[4]/trials &lt;&lt; "%)" &lt;&lt; std::endl
&lt;&lt; "Trips: " &lt;&lt; results[3] &lt;&lt; "\t (" &lt;&lt; 100*results[3]/trials &lt;&lt; "%)" &lt;&lt; std::endl
&lt;&lt; "2-Pairs: " &lt;&lt; results[2] &lt;&lt; "\t (" &lt;&lt; 100*results[2]/trials &lt;&lt; "%)" &lt;&lt; std::endl
&lt;&lt; "1-Pairs: " &lt;&lt; results[1] &lt;&lt; "\t (" &lt;&lt; 100*results[1]/trials &lt;&lt; "%)" &lt;&lt; std::endl
&lt;&lt; "Hi-Cards: " &lt;&lt; results[0] &lt;&lt; "\t (" &lt;&lt; 100*results[0]/trials &lt;&lt; "%)" &lt;&lt; std::endl;


return 0;
}

</pre><hr />
Reply With Quote
  #180  
Old 01-17-2007, 04:04 PM
mark007 mark007 is offline
Junior Member
 
Join Date: Jan 2007
Posts: 12
Default Re: 7 Card Hand Evaluators

Hand Strength or probability that your hand is ahead / behind depends on the other players cards, aswell as how many players you are against. Even if you just compare your hand versus x random hands, the number x (players playing) has a massive impact on the probabilities so I don't think what you are thinking of doing thomash is possible in this sense.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 11:10 AM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2026, vBulletin Solutions Inc.