HoldemHand.Hand.HandStrength C# (CSharp) Method

HandStrength() public static method

A HandStrength function that accounts for multiple opponents. This method uses the Monte Carlo menthod to calculate a value. It takes surprisingly little time to get good results. A duration of 0.01 seconds (10mS) returns good results, and a duration of 0.1 (100mS) returns even better results.
public static HandStrength ( string pocketquery, string board, int NOpponnents, double duration ) : double
pocketquery string pocket mask query
board string current board
NOpponnents int the number of opponents (must be 1-9)
duration double time in seconds to perform this calculation
return double
        public static double HandStrength(string pocketquery, string board, int NOpponnents, double duration)
        {
            double win = 0.0, count = 0.0;
            double starttime = CurrentTime;
            ulong[] list = PocketHands.Query(pocketquery);
            ulong boardmask = ParseHand(board);
            Random rand = new Random();

            #if DEBUG
            if (!PocketHands.ValidateQuery(pocketquery, Hand.ParseHand(board)))
                throw new ArgumentException("pocketquery and/or board is invalid");
            if (BitCount(boardmask) > 5)
                throw new ArgumentException("board must have 5 or less cards");
            if (NOpponnents < 1 || NOpponnents > 9)
                throw new ArgumentException("may only select 1-9 opponents");
            #endif

            switch (NOpponnents)
            {
                case 1:
                    while ((CurrentTime - starttime) < duration)
                    {
                        ulong pocketmask = RandomHand(rand, list, 0UL, 2);
                        uint ourrank = Evaluate(pocketmask | boardmask);
                        ulong oppcards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
                        uint opprank = Evaluate(oppcards | boardmask);
                        if (ourrank > opprank)
                        {
                            win += 1.0;
                        }
                        else if (ourrank == opprank)
                        {
                            win += 0.5;
                        }
                        count += 1.0;
                    }
                    break;
                case 2:
                    while ((CurrentTime - starttime) < duration)
                    {
                        ulong pocketmask = RandomHand(rand, list, 0UL, 2);
                        uint ourrank = Evaluate(pocketmask | boardmask);
                        ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
                        ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
                        uint opp1rank = Evaluate(opp1cards | boardmask);
                        uint opp2rank = Evaluate(opp2cards | boardmask);

                        if (ourrank > opp1rank && ourrank > opp2rank)
                        {
                            win += 1.0;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank)
                        {
                            win += 0.5;
                        }
                        count += 1.0;

                    }
                    break;
                case 3:
                    while ((CurrentTime - starttime) < duration)
                    {
                        ulong pocketmask = RandomHand(rand, list, 0UL, 2);
                        uint ourrank = Evaluate(pocketmask | boardmask);
                        ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
                        ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
                        ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
                        uint opp1rank = Evaluate(opp1cards | boardmask);
                        uint opp2rank = Evaluate(opp2cards | boardmask);
                        uint opp3rank = Evaluate(opp3cards | boardmask);

                        if (ourrank > opp1rank && ourrank > opp2rank && ourrank > opp3rank)
                        {
                            win += 1.0;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank && ourrank >= opp3rank)
                        {
                            win += 0.5;
                        }
                        count += 1.0;

                    }
                    break;
                case 4:
                    while ((CurrentTime - starttime) < duration)
                    {
                        ulong pocketmask = RandomHand(rand, list, 0UL, 2);
                        uint ourrank = Evaluate(pocketmask | boardmask);
                        ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
                        ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
                        ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
                        ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
                        uint opp1rank = Evaluate(opp1cards | boardmask);
                        uint opp2rank = Evaluate(opp2cards | boardmask);
                        uint opp3rank = Evaluate(opp3cards | boardmask);
                        uint opp4rank = Evaluate(opp4cards | boardmask);

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank)
                        {
                            win += 1.0;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank)
                        {
                            win += 0.5;
                        }
                        count += 1.0;

                    }
                    break;
                case 5:
                    while ((CurrentTime - starttime) < duration)
                    {
                        ulong pocketmask = RandomHand(rand, list, 0UL, 2);
                        uint ourrank = Evaluate(pocketmask | boardmask);
                        ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
                        ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
                        ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
                        ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
                        ulong opp5cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards, 2);
                        uint opp1rank = Evaluate(opp1cards | boardmask);
                        uint opp2rank = Evaluate(opp2cards | boardmask);
                        uint opp3rank = Evaluate(opp3cards | boardmask);
                        uint opp4rank = Evaluate(opp4cards | boardmask);
                        uint opp5rank = Evaluate(opp5cards | boardmask);

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank &&
                            ourrank > opp5rank)
                        {
                            win += 1.0;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank &&
                            ourrank >= opp5rank)
                        {
                            win += 0.5;
                        }
                        count += 1.0;

                    }
                    break;
                case 6:
                    while ((CurrentTime - starttime) < duration)
                    {
                        ulong pocketmask = RandomHand(rand, list, 0UL, 2);
                        uint ourrank = Evaluate(pocketmask | boardmask);
                        ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
                        ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
                        ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
                        ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
                        ulong opp5cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards, 2);
                        ulong opp6cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards, 2);
                        uint opp1rank = Evaluate(opp1cards | boardmask);
                        uint opp2rank = Evaluate(opp2cards | boardmask);
                        uint opp3rank = Evaluate(opp3cards | boardmask);
                        uint opp4rank = Evaluate(opp4cards | boardmask);
                        uint opp5rank = Evaluate(opp5cards | boardmask);
                        uint opp6rank = Evaluate(opp6cards | boardmask);

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank &&
                            ourrank > opp5rank && ourrank > opp6rank)
                        {
                            win += 1.0;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank &&
                            ourrank >= opp5rank && ourrank >= opp6rank)
                        {
                            win += 0.5;
                        }
                        count += 1.0;
                    }
                    break;
                case 7:
                    while ((CurrentTime - starttime) < duration)
                    {
                        ulong pocketmask = RandomHand(rand, list, 0UL, 2);
                        uint ourrank = Evaluate(pocketmask | boardmask);
                        ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
                        ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
                        ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
                        ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
                        ulong opp5cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards, 2);
                        ulong opp6cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards, 2);
                        ulong opp7cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards, 2);
                        uint opp1rank = Evaluate(opp1cards | boardmask);
                        uint opp2rank = Evaluate(opp2cards | boardmask);
                        uint opp3rank = Evaluate(opp3cards | boardmask);
                        uint opp4rank = Evaluate(opp4cards | boardmask);
                        uint opp5rank = Evaluate(opp5cards | boardmask);
                        uint opp6rank = Evaluate(opp6cards | boardmask);
                        uint opp7rank = Evaluate(opp7cards | boardmask);

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank &&
                            ourrank > opp5rank && ourrank > opp6rank &&
                            ourrank > opp7rank)
                        {
                            win += 1.0;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank &&
                            ourrank >= opp5rank && ourrank >= opp6rank &&
                            ourrank >= opp7rank)
                        {
                            win += 0.5;
                        }
                        count += 1.0;
                    }
                    break;
                case 8:
                    while ((CurrentTime - starttime) < duration)
                    {
                        ulong pocketmask = RandomHand(rand, list, 0UL, 2);
                        uint ourrank = Evaluate(pocketmask | boardmask);
                        ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
                        ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
                        ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
                        ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
                        ulong opp5cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards, 2);
                        ulong opp6cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards, 2);
                        ulong opp7cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards, 2);
                        ulong opp8cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards | opp7cards, 2);
                        uint opp1rank = Evaluate(opp1cards | boardmask);
                        uint opp2rank = Evaluate(opp2cards | boardmask);
                        uint opp3rank = Evaluate(opp3cards | boardmask);
                        uint opp4rank = Evaluate(opp4cards | boardmask);
                        uint opp5rank = Evaluate(opp5cards | boardmask);
                        uint opp6rank = Evaluate(opp6cards | boardmask);
                        uint opp7rank = Evaluate(opp7cards | boardmask);
                        uint opp8rank = Evaluate(opp8cards | boardmask);

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank &&
                            ourrank > opp5rank && ourrank > opp6rank &&
                            ourrank > opp7rank && ourrank > opp8rank)
                        {
                            win += 1.0;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank &&
                            ourrank >= opp5rank && ourrank >= opp6rank &&
                            ourrank >= opp7rank && ourrank >= opp8rank)
                        {
                            win += 0.5;
                        }
                        count += 1.0;
                    }
                    break;
                case 9:
                    while ((CurrentTime - starttime) < duration)
                    {
                        ulong pocketmask = RandomHand(rand, list, 0UL, 2);
                        uint ourrank = Evaluate(pocketmask | boardmask);
                        ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
                        ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
                        ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
                        ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
                        ulong opp5cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards, 2);
                        ulong opp6cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards, 2);
                        ulong opp7cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards, 2);
                        ulong opp8cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards | opp7cards, 2);
                        ulong opp9cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards | opp7cards | opp8cards, 2);
                        uint opp1rank = Evaluate(opp1cards | boardmask);
                        uint opp2rank = Evaluate(opp2cards | boardmask);
                        uint opp3rank = Evaluate(opp3cards | boardmask);
                        uint opp4rank = Evaluate(opp4cards | boardmask);
                        uint opp5rank = Evaluate(opp5cards | boardmask);
                        uint opp6rank = Evaluate(opp6cards | boardmask);
                        uint opp7rank = Evaluate(opp7cards | boardmask);
                        uint opp8rank = Evaluate(opp8cards | boardmask);
                        uint opp9rank = Evaluate(opp9cards | boardmask);

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank &&
                            ourrank > opp5rank && ourrank > opp6rank &&
                            ourrank > opp7rank && ourrank > opp8rank &&
                            ourrank > opp9rank)
                        {
                            win += 1.0;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank &&
                            ourrank >= opp5rank && ourrank >= opp6rank &&
                            ourrank >= opp7rank && ourrank >= opp8rank &&
                            ourrank >= opp9rank)
                        {
                            win += 0.5;
                        }
                        count += 1.0;
                    }
                    break;
            }

            return win / count;
        }

Same methods

Hand::HandStrength ( ulong pocket, ulong board ) : double
Hand::HandStrength ( ulong pocket, ulong board, int NOpponnents, double duration ) : double