HoldemHand.Hand.HandPotential C# (CSharp) Method

HandPotential() public static method

This method is similar to the HandPotential algorithm described in Aaron Davidson's masters thesis, however if differs in several significant ways. First, it makes the calculation while accounting for one or more opponents. Second, it uses the Monte Carlo technique to get answers in a reasonable amount of time (a duration of 0.1 seems to give reasonable results). And finally, the results are not normalized; the positive and negative potential is the actual odds of improvement or worsening of a mask.
public static HandPotential ( string pockethand, string boardhand, double &ppot, double &npot, int NOpponents, double duration ) : void
pockethand string Players pocket card query string
boardhand string The current board string
ppot double The resultant positive potential
npot double The resultant negative potential
NOpponents int The number of opponents
duration double The length of time (in seconds) to spend on this calculation
return void
        public static void HandPotential(string pockethand, string boardhand, out double ppot, out double npot, int NOpponents, double duration)
        {
            const int ahead = 2;
            const int tied = 1;
            const int behind = 0;

            ulong board = ParseHand(boardhand);
            ulong[] list = PocketHands.Query(pockethand);

            #if DEBUG
            if (BitCount(board) != 3 && BitCount(board) != 4)
                throw new ArgumentException("board must contain only 3 or 4 cards");
            #endif
            ppot = npot = 0.0;

            int[,]  HP = new int[3, 3];
            int     count = 0;
            int     ncards = BitCount(board)+2;
            uint    ourbest;
            Random rand = new Random();
            double  start = CurrentTime;

            switch (NOpponents)
            {
                case 1:
                    while ((CurrentTime - start) < duration)
                    {
                        ulong pocket = RandomHand(rand, list, board, 2);
                        uint ourrank = Evaluate(pocket | board);
                        ulong opp1Pocket = Hand.RandomHand(rand, 0UL, pocket | board, 2);
                        uint opp1rank = Evaluate(opp1Pocket | board, ncards);
                        int index;

                        if (ourrank > opp1rank)
                        {
                            index = ahead;
                        }
                        else if (ourrank >= opp1rank)
                        {
                            index = tied;
                        }
                        else
                        {
                            index = behind;
                        }

                        ulong boardmask = Hand.RandomHand(rand, board, pocket | opp1Pocket, 5);
                        ourbest = Evaluate(pocket | boardmask, 7);
                        uint opp1best = Evaluate(opp1Pocket | boardmask, 7);
                        if (ourbest > opp1best)
                        {
                            HP[index, ahead]++;
                            //if (index == behind || index == tied)
                            //    count++;
                        }
                        else if (ourbest >= opp1best)
                        {
                            HP[index, tied]++;
                            //if (index == behind || index == ahead)
                            //    count++;
                        }
                        else
                        {
                            HP[index, behind]++;
                            //if (index == ahead || index == tied)
                            //    count++;
                        }
                        count++;
                    }
                    break;
                case 2:
                    while ((CurrentTime - start) < duration)
                    {
                        ulong pocket = RandomHand(rand, list, board, 2);
                        uint ourrank = Evaluate(pocket | board);
                        ulong opp1Pocket = Hand.RandomHand(rand, 0UL, pocket | board, 2);
                        ulong opp2Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket, 2);
                        uint opp1rank = Evaluate(opp1Pocket | board);
                        uint opp2rank = Evaluate(opp2Pocket | board);
                        int index;

                        if (ourrank > opp1rank && ourrank > opp2rank)
                        {
                            index = ahead;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank)
                        {
                            index = tied;
                        }
                        else
                        {
                            index = behind;
                        }

                        ulong boardmask = Hand.RandomHand(rand, board, pocket | opp1Pocket | opp2Pocket, 5);
                        ourbest = Evaluate(pocket | boardmask, 7);
                        uint opp1best = Evaluate(opp1Pocket | boardmask, 7);
                        uint opp2best = Evaluate(opp2Pocket | boardmask, 7);
                        if (ourbest > opp1best && ourbest > opp2best)
                        {
                            HP[index, ahead]++;
                            //if (index == behind || index == tied)
                            //    count++;
                        }
                        else if (ourbest >= opp1best && ourbest >= opp2best)
                        {
                            HP[index, tied]++;
                            //if (index == behind || index == ahead)
                            //    count++;
                        }
                        else
                        {
                            HP[index, behind]++;
                            //if (index == ahead || index == tied)
                            //    count++;
                        }
                        count++;
                    }
                    break;
                case 3:
                    while ((CurrentTime - start) < duration)
                    {
                        ulong pocket = RandomHand(rand, list, board, 2);
                        uint ourrank = Evaluate(pocket | board);
                        ulong opp1Pocket = Hand.RandomHand(rand, 0UL, pocket | board, 2);
                        ulong opp2Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket, 2);
                        ulong opp3Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket, 2);
                        uint opp1rank = Evaluate(opp1Pocket | board);
                        uint opp2rank = Evaluate(opp2Pocket | board);
                        uint opp3rank = Evaluate(opp3Pocket | board);
                        int index;

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank)
                        {
                            index = ahead;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank)
                        {
                            index = tied;
                        }
                        else
                        {
                            index = behind;
                        }

                        ulong boardmask = Hand.RandomHand(rand, board, pocket | opp1Pocket | opp2Pocket | opp3Pocket, 5);
                        ourbest = Evaluate(pocket | boardmask, 7);
                        uint opp1best = Evaluate(opp1Pocket | boardmask, 7);
                        uint opp2best = Evaluate(opp2Pocket | boardmask, 7);
                        uint opp3best = Evaluate(opp3Pocket | boardmask, 7);
                        if (ourbest > opp1best && ourbest > opp2best &&
                            ourbest > opp3best)
                        {
                            HP[index, ahead]++;
                            //if (index == behind || index == tied)
                            //   count++;
                        }
                        else if (ourbest >= opp1best && ourbest >= opp2best &&
                            ourbest >= opp3best)
                        {
                            HP[index, tied]++;
                            //if (index == behind || index == ahead)
                            //   count++;
                        }
                        else
                        {
                            HP[index, behind]++;
                            //if (index == ahead || index == tied)
                            //    count++;
                        }
                        count++;
                    }
                    break;
                case 4:
                    while ((CurrentTime - start) < duration)
                    {
                        ulong pocket = RandomHand(rand, list, board, 2);
                        uint ourrank = Evaluate(pocket | board);
                        ulong opp1Pocket = Hand.RandomHand(rand, 0UL, pocket | board, 2);
                        ulong opp2Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket, 2);
                        ulong opp3Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket, 2);
                        ulong opp4Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket, 2);
                        uint opp1rank = Evaluate(opp1Pocket | board);
                        uint opp2rank = Evaluate(opp2Pocket | board);
                        uint opp3rank = Evaluate(opp3Pocket | board);
                        uint opp4rank = Evaluate(opp4Pocket | board);
                        int index;

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank)
                        {
                            index = ahead;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank)
                        {
                            index = tied;
                        }
                        else
                        {
                            index = behind;
                        }

                        ulong boardmask = Hand.RandomHand(rand, board, pocket | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket, 5);
                        ourbest = Evaluate(pocket | boardmask, 7);
                        uint opp1best = Evaluate(opp1Pocket | boardmask, 7);
                        uint opp2best = Evaluate(opp2Pocket | boardmask, 7);
                        uint opp3best = Evaluate(opp3Pocket | boardmask, 7);
                        uint opp4best = Evaluate(opp4Pocket | boardmask, 7);
                        if (ourbest > opp1best && ourbest > opp2best &&
                            ourbest > opp3best && ourbest > opp4best)
                        {
                            HP[index, ahead]++;
                            //if (index == behind || index == tied)
                            //    count++;
                        }
                        else if (ourbest >= opp1best && ourbest >= opp2best &&
                            ourbest >= opp3best && ourbest >= opp4best)
                        {
                            HP[index, tied]++;
                            //if (index == behind || index == ahead)
                            //    count++;
                        }
                        else
                        {
                            HP[index, behind]++;
                            //if (index == ahead || index == tied)
                            //    count++;
                        }
                        count++;
                    }
                    break;
                case 5:
                    while ((CurrentTime - start) < duration)
                    {
                        ulong pocket = RandomHand(rand, list, board, 2);
                        uint ourrank = Evaluate(pocket | board);
                        ulong opp1Pocket = Hand.RandomHand(rand, 0UL, pocket | board, 2);
                        ulong opp2Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket, 2);
                        ulong opp3Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket, 2);
                        ulong opp4Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket, 2);
                        ulong opp5Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket, 2);
                        uint opp1rank = Evaluate(opp1Pocket | board);
                        uint opp2rank = Evaluate(opp2Pocket | board);
                        uint opp3rank = Evaluate(opp3Pocket | board);
                        uint opp4rank = Evaluate(opp4Pocket | board);
                        uint opp5rank = Evaluate(opp5Pocket | board);
                        int index;

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank &&
                            ourrank > opp5rank)
                        {
                            index = ahead;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank &&
                            ourrank >= opp5rank)
                        {
                            index = tied;
                        }
                        else
                        {
                            index = behind;
                        }

                        ulong boardmask = Hand.RandomHand(rand, board, pocket | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket, 5);
                        ourbest = Evaluate(pocket | boardmask, 7);
                        uint opp1best = Evaluate(opp1Pocket | boardmask, 7);
                        uint opp2best = Evaluate(opp2Pocket | boardmask, 7);
                        uint opp3best = Evaluate(opp3Pocket | boardmask, 7);
                        uint opp4best = Evaluate(opp4Pocket | boardmask, 7);
                        uint opp5best = Evaluate(opp5Pocket | boardmask, 7);
                        if (ourbest > opp1best && ourbest > opp2best &&
                            ourbest > opp3best && ourbest > opp4best &&
                            ourbest > opp5best)
                        {
                            HP[index, ahead]++;
                            //if (index == behind || index == tied)
                            //    count++;
                        }
                        else if (ourbest >= opp1best && ourbest >= opp2best &&
                            ourbest >= opp3best && ourbest >= opp4best &&
                            ourbest >= opp5best)
                        {
                            HP[index, tied]++;
                            //if (index == behind || index == ahead)
                            //    count++;
                        }
                        else
                        {
                            HP[index, behind]++;
                            //if (index == ahead || index == tied)
                            //    count++;
                        }
                        count++;
                    }
                    break;
                case 6:
                    while ((CurrentTime - start) < duration)
                    {
                        ulong pocket = RandomHand(rand, list, board, 2);
                        uint ourrank = Evaluate(pocket | board);
                        ulong opp1Pocket = Hand.RandomHand(rand, 0UL, pocket | board, 2);
                        ulong opp2Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket, 2);
                        ulong opp3Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket, 2);
                        ulong opp4Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket, 2);
                        ulong opp5Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket, 2);
                        ulong opp6Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket, 2);
                        uint opp1rank = Evaluate(opp1Pocket | board);
                        uint opp2rank = Evaluate(opp2Pocket | board);
                        uint opp3rank = Evaluate(opp3Pocket | board);
                        uint opp4rank = Evaluate(opp4Pocket | board);
                        uint opp5rank = Evaluate(opp5Pocket | board);
                        uint opp6rank = Evaluate(opp6Pocket | board);
                        int index;

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank &&
                            ourrank > opp5rank && ourrank > opp6rank)
                        {
                            index = ahead;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank &&
                            ourrank >= opp5rank && ourrank >= opp6rank)
                        {
                            index = tied;
                        }
                        else
                        {
                            index = behind;
                        }

                        ulong boardmask = Hand.RandomHand(rand, board, pocket | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket | opp6Pocket, 5);
                        ourbest = Evaluate(pocket | boardmask, 7);
                        uint opp1best = Evaluate(opp1Pocket | boardmask, 7);
                        uint opp2best = Evaluate(opp2Pocket | boardmask, 7);
                        uint opp3best = Evaluate(opp3Pocket | boardmask, 7);
                        uint opp4best = Evaluate(opp4Pocket | boardmask, 7);
                        uint opp5best = Evaluate(opp5Pocket | boardmask, 7);
                        uint opp6best = Evaluate(opp6Pocket | boardmask, 7);
                        if (ourbest > opp1best && ourbest > opp2best &&
                            ourbest > opp3best && ourbest > opp4best &&
                            ourbest > opp5best && ourbest > opp6best)
                        {
                            HP[index, ahead]++;
                            //if (index == behind || index == tied)
                            //    count++;
                        }
                        else if (ourbest >= opp1best && ourbest >= opp2best &&
                            ourbest >= opp3best && ourbest >= opp4best &&
                            ourbest >= opp5best && ourbest >= opp6best)
                        {
                            HP[index, tied]++;
                            //if (index == behind || index == ahead)
                            //   count++;
                        }
                        else
                        {
                            HP[index, behind]++;
                            //if (index == ahead || index == tied)
                            //    count++;
                        }
                        count++;
                    }
                    break;
                case 7:
                    while ((CurrentTime - start) < duration)
                    {
                        ulong pocket = RandomHand(rand, list, board, 2);
                        uint ourrank = Evaluate(pocket | board);
                        ulong opp1Pocket = Hand.RandomHand(rand, 0UL, pocket | board, 2);
                        ulong opp2Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket, 2);
                        ulong opp3Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket, 2);
                        ulong opp4Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket, 2);
                        ulong opp5Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket, 2);
                        ulong opp6Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket, 2);
                        ulong opp7Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket | opp6Pocket, 2);
                        uint opp1rank = Evaluate(opp1Pocket | board);
                        uint opp2rank = Evaluate(opp2Pocket | board);
                        uint opp3rank = Evaluate(opp3Pocket | board);
                        uint opp4rank = Evaluate(opp4Pocket | board);
                        uint opp5rank = Evaluate(opp5Pocket | board);
                        uint opp6rank = Evaluate(opp6Pocket | board);
                        uint opp7rank = Evaluate(opp7Pocket | board);
                        int index;

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank &&
                            ourrank > opp5rank && ourrank > opp6rank &&
                            ourrank > opp7rank)
                        {
                            index = ahead;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank &&
                            ourrank >= opp5rank && ourrank >= opp6rank &&
                            ourrank >= opp7rank)
                        {
                            index = tied;
                        }
                        else
                        {
                            index = behind;
                        }

                        ulong boardmask = Hand.RandomHand(rand, board, pocket | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket | opp6Pocket | opp7Pocket, 5);
                        ourbest = Evaluate(pocket | boardmask, 7);
                        uint opp1best = Evaluate(opp1Pocket | boardmask, 7);
                        uint opp2best = Evaluate(opp2Pocket | boardmask, 7);
                        uint opp3best = Evaluate(opp3Pocket | boardmask, 7);
                        uint opp4best = Evaluate(opp4Pocket | boardmask, 7);
                        uint opp5best = Evaluate(opp5Pocket | boardmask, 7);
                        uint opp6best = Evaluate(opp6Pocket | boardmask, 7);
                        uint opp7best = Evaluate(opp7Pocket | boardmask, 7);
                        if (ourbest > opp1best && ourbest > opp2best &&
                            ourbest > opp3best && ourbest > opp4best &&
                            ourbest > opp5best && ourbest > opp6best &&
                            ourbest > opp7best)
                        {
                            HP[index, ahead]++;
                            //if (index == behind || index == tied)
                            //    count++;
                        }
                        else if (ourbest >= opp1best && ourbest >= opp2best &&
                            ourbest >= opp3best && ourbest >= opp4best &&
                            ourbest >= opp5best && ourbest >= opp6best &&
                            ourbest >= opp7best)
                        {
                            HP[index, tied]++;
                            //if (index == behind || index == ahead)
                            //    count++;
                        }
                        else
                        {
                            HP[index, behind]++;
                            //if (index == ahead || index == tied)
                            //    count++;
                        }
                        count++;
                    }
                    break;
                case 8:
                    while ((CurrentTime - start) < duration)
                    {
                        ulong pocket = RandomHand(rand, list, board, 2);
                        uint ourrank = Evaluate(pocket | board);
                        ulong opp1Pocket = Hand.RandomHand(rand, 0UL, pocket | board, 2);
                        ulong opp2Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket, 2);
                        ulong opp3Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket, 2);
                        ulong opp4Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket, 2);
                        ulong opp5Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket, 2);
                        ulong opp6Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket, 2);
                        ulong opp7Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket | opp6Pocket, 2);
                        ulong opp8Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket | opp6Pocket | opp7Pocket, 2);
                        uint opp1rank = Evaluate(opp1Pocket | board);
                        uint opp2rank = Evaluate(opp2Pocket | board);
                        uint opp3rank = Evaluate(opp3Pocket | board);
                        uint opp4rank = Evaluate(opp4Pocket | board);
                        uint opp5rank = Evaluate(opp5Pocket | board);
                        uint opp6rank = Evaluate(opp6Pocket | board);
                        uint opp7rank = Evaluate(opp7Pocket | board);
                        uint opp8rank = Evaluate(opp8Pocket | board);
                        int index;

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank &&
                            ourrank > opp5rank && ourrank > opp6rank &&
                            ourrank > opp7rank && ourrank > opp8rank)
                        {
                            index = ahead;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank &&
                            ourrank >= opp5rank && ourrank >= opp6rank &&
                            ourrank >= opp7rank && ourrank >= opp8rank)
                        {
                            index = tied;
                        }
                        else
                        {
                            index = behind;
                        }

                        ulong boardmask = Hand.RandomHand(rand, board, pocket | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket | opp6Pocket | opp7Pocket | opp8Pocket, 5);
                        ourbest = Evaluate(pocket | boardmask, 7);
                        uint opp1best = Evaluate(opp1Pocket | boardmask, 7);
                        uint opp2best = Evaluate(opp2Pocket | boardmask, 7);
                        uint opp3best = Evaluate(opp3Pocket | boardmask, 7);
                        uint opp4best = Evaluate(opp4Pocket | boardmask, 7);
                        uint opp5best = Evaluate(opp5Pocket | boardmask, 7);
                        uint opp6best = Evaluate(opp6Pocket | boardmask, 7);
                        uint opp7best = Evaluate(opp7Pocket | boardmask, 7);
                        uint opp8best = Evaluate(opp8Pocket | boardmask, 7);
                        if (ourbest > opp1best && ourbest > opp2best &&
                            ourbest > opp3best && ourbest > opp4best &&
                            ourbest > opp5best && ourbest > opp6best &&
                            ourbest > opp7best && ourbest > opp8best)
                        {
                            HP[index, ahead]++;
                            //if (index == behind || index == tied)
                            //    count++;
                        }
                        else if (ourbest >= opp1best && ourbest >= opp2best &&
                            ourbest >= opp3best && ourbest >= opp4best &&
                            ourbest >= opp5best && ourbest >= opp6best &&
                            ourbest >= opp7best && ourbest >= opp8best)
                        {
                            HP[index, tied]++;
                            //if (index == behind || index == ahead)
                            //    count++;
                        }
                        else
                        {
                            HP[index, behind]++;
                            //if (index == ahead || index == tied)
                            //    count++;
                        }
                        count++;
                    }
                    break;
                case 9:
                    while ((CurrentTime - start) < duration)
                    {
                        ulong pocket = RandomHand(rand, list, board, 2);
                        uint ourrank = Evaluate(pocket | board);
                        ulong opp1Pocket = Hand.RandomHand(rand, 0UL, pocket | board, 2);
                        ulong opp2Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket, 2);
                        ulong opp3Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket, 2);
                        ulong opp4Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket, 2);
                        ulong opp5Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket, 2);
                        ulong opp6Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket, 2);
                        ulong opp7Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket | opp6Pocket, 2);
                        ulong opp8Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket | opp6Pocket | opp7Pocket, 2);
                        ulong opp9Pocket = Hand.RandomHand(rand, 0UL, pocket | board | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket | opp6Pocket | opp7Pocket | opp8Pocket, 2);
                        uint opp1rank = Evaluate(opp1Pocket | board);
                        uint opp2rank = Evaluate(opp2Pocket | board);
                        uint opp3rank = Evaluate(opp3Pocket | board);
                        uint opp4rank = Evaluate(opp4Pocket | board);
                        uint opp5rank = Evaluate(opp5Pocket | board);
                        uint opp6rank = Evaluate(opp6Pocket | board);
                        uint opp7rank = Evaluate(opp7Pocket | board);
                        uint opp8rank = Evaluate(opp8Pocket | board);
                        uint opp9rank = Evaluate(opp9Pocket | board);
                        int index;

                        if (ourrank > opp1rank && ourrank > opp2rank &&
                            ourrank > opp3rank && ourrank > opp4rank &&
                            ourrank > opp5rank && ourrank > opp6rank &&
                            ourrank > opp7rank && ourrank > opp8rank &&
                            ourrank > opp9rank)
                        {
                            index = ahead;
                        }
                        else if (ourrank >= opp1rank && ourrank >= opp2rank &&
                            ourrank >= opp3rank && ourrank >= opp4rank &&
                            ourrank >= opp5rank && ourrank >= opp6rank &&
                            ourrank >= opp7rank && ourrank >= opp8rank &&
                            ourrank >= opp9rank)
                        {
                            index = tied;
                        }
                        else
                        {
                            index = behind;
                        }

                        ulong boardmask = Hand.RandomHand(rand, board, pocket | opp1Pocket | opp2Pocket | opp3Pocket | opp4Pocket | opp5Pocket | opp6Pocket | opp7Pocket | opp8Pocket | opp9Pocket, 5);
                        ourbest = Evaluate(pocket | boardmask, 7);
                        uint opp1best = Evaluate(opp1Pocket | boardmask, 7);
                        uint opp2best = Evaluate(opp2Pocket | boardmask, 7);
                        uint opp3best = Evaluate(opp3Pocket | boardmask, 7);
                        uint opp4best = Evaluate(opp4Pocket | boardmask, 7);
                        uint opp5best = Evaluate(opp5Pocket | boardmask, 7);
                        uint opp6best = Evaluate(opp6Pocket | boardmask, 7);
                        uint opp7best = Evaluate(opp7Pocket | boardmask, 7);
                        uint opp8best = Evaluate(opp8Pocket | boardmask, 7);
                        uint opp9best = Evaluate(opp9Pocket | boardmask, 7);
                        if (ourbest > opp1best && ourbest > opp2best &&
                            ourbest > opp3best && ourbest > opp4best &&
                            ourbest > opp5best && ourbest > opp6best &&
                            ourbest > opp7best && ourbest > opp8best &&
                            ourbest > opp9best)
                        {
                            HP[index, ahead]++;
                            //if (index == behind || index == tied)
                            //    count++;
                        }
                        else if (ourbest >= opp1best && ourbest >= opp2best &&
                            ourbest >= opp3best && ourbest >= opp4best &&
                            ourbest >= opp5best && ourbest >= opp6best &&
                            ourbest >= opp7best && ourbest >= opp8best &&
                            ourbest >= opp9best)
                        {
                            HP[index, tied]++;
                            //if (index == behind || index == ahead)
                            //    count++;
                        }
                        else
                        {
                            HP[index, behind]++;
                            //if (index == ahead || index == tied)
                            //    count++;
                        }
                        count++;
                    }
                    break;

            }
            if (count != 0)
            {
                ppot = (HP[behind, ahead] + (HP[behind, tied] / 2.0) + (HP[tied, ahead] / 2.0)) / ((double)count);
                npot = (HP[ahead, behind] + (HP[ahead, tied] / 2.0) + (HP[tied, behind] / 2.0)) / ((double)count);
            }
        }

Same methods

Hand::HandPotential ( ulong pocket, ulong board, double &ppot, double &npot ) : void
Hand::HandPotential ( ulong pocket, ulong board, double &ppot, double &npot, int NOpponents, double duration ) : void