As in most of the
other combinatoric problems for Bridge hands, the first step
in calculating the number of hands for each distribution (and
their probability) is to calculate the total possible number
of different hands. A Bridge hand consists of 13 cards
randomly selected from a deck of 52 cards. Hence the total
number of possible hands is COMBIN( 52,13) = 635,013,559,600.
This number serves two purposes. First we will divide the
numbers that appears in the "Total Hands" column to get the
probability of each of the possible distributions. We also
will add all the numbers in the "Total Hands" column to make
sure the grand total is 635,013,559,600. (It's an "oops" if
they don't match.)
Next, we will show how to calculate the total
hands for a particular distribution (e.g. 5, 3, 3, 2), and
then expand this into a general rule, which can be used by a
computer program.
In our 5, 3, 3, 2 example, the first suit has 5
cards that will be selected randomly from 13 cards. Thus the
number of combinations here is COMBIN( 13, 5) = 1,287
combinations.
The second suit has 3 cards that will be randomly
selected from another 13 cards. Thus the number of
combinations for it is: COMBIN( 13, 3) = 286.
Similarly suits 3 and 4 contribute COMBIN( 13, 3)
= 286, and COMBIN( 13, 2) = 78
The total number of combinations from the four
suits is thus 1,287 * 286 * 286 * 78 = 8,211,173,256.
Next we have to consider what part the various
suits play. The first suit can be any of the 4 suits in the
deck, the second suit can be any of the remaining 3, the third
can be either of the remaining 2 suits, and the fourth gets
what is left over. The total combinations are thus 24. We
multiply the 8,211,173,256 by 24 to get 197,068,158,144. If we
were calculating a distribution that had 4 different counts
for each suit (e.g. 5, 4, 3, 1), this would be the end of the
calculations. Unfortunately, our 5, 3, 3, 2 distribution has
two suits that have the same length.
To compensate for double counting using these two
suits, we have to divide our prior result of 197,068,158,144
by 2 to get 98,534,079,072. This is what we see in the table
output. More specifically, we scan the numbers in the suit
distribution. If there are two numbers that are the same, we
actually divide by "2 Factorial" ( FACT(2) = 2). If we were
calculating 7, 2, 2, 2 distribution, we would note that "2"
appears 3 times. Then to adjust for double counting we would
have to divide by FACT(3) = 6.
We can now form the general rule for calculating
suit distribution combinatorics. Given any distribution A, B,
C, D where "A", "B", "C", and "D" represent the number of
cards in each suit, we first calculate COMBIN( 13, A) * COMBIN
( 13, B) * COMBIN( 13, C) * COMBIN( 13, D). Next we multiply
by 24 for permutations of the four suits. Finally, we scan the
numbers "A", "B", "C", "D" to see if any number occurs more
than once. For each occasion where a number appears twice we
divide by FACT(2) = 2. (In this problem there can't be more
than 1 pair of matched numbers, but this could occur in other
problems). Then, for each set where 3 numbers match (e.g. if
we were using 7, 2, 2, 2) we divide by FACT(3) = 6. (These are
the only matched sets that can occur in this problem, but more
complicated problems would extend this rule).
We now know how to calculate the number of
combinations for any suit distribution. The only thing left to
do is generate all possible suit distributions, and apply the
above rules. Once again it is time to run a program on our
friendly computer.
The general algorithm will be:
Set up a loop system to
generate all possible suit distributions.
Scan the number of cards in each suit to
see if there are duplicate quantities in different suits.
Adjust the "24" suit permutation number
if duplicates are found
Calculate all the COMBIN() functions
Print a row of results
Repeat for all possible distributions
Note that suit distributions will be generated in the
following order:
13, 0, 0, 0
12, 1, 0, 0
11, 2, 0, 0
11, 1, 1, 0
etc.
as shown in the printout. Also note that the numbers are in
descending order on each row. This order plays a part in how
the numbers are generated in the computer program.
The actual "C" code would be similar to:
/* Print the
column labels for the output table.
*/
/*
The first suit can have
*/
for (Suit1 = 13; Suit1 >= 4; Suit1--)
{ /*
anywhere from 4 to 13 cards.
*/
/*
Suit 2 can have as many as
*/
for (Suit2 = Suit1; Suit2 >= 0; Suit2--)
{ /* Suit1, or it could be
0 */
TotCards = Suit 1 +
Suit2;
/* Total cards so far.
*/
if (TotCards >
13)
/*
Can't have more than 13 cards. */
/* If
over 13 then not a valid hand. */
continue;
/*
Skip to next attempt.
*/
if ((Suit1 + 3 * Suit2 ) <
13)
/*
Same if the remaining suits
*/
/*
can't get to 13 cards.
*/
break;
/*
Use to jump out of inner loop. */
for (Suit3 = Suit2; Suit3 >=
0; Suit3--) { /* Loop for the 3rd
suit
*/
TotCards = Suit1 +
Suit2 + Suit3;
/* Total
cards in first 3 suits */
Suit4 = 13 -
TotCards;
/*
Suit 4 gets what's left
*/
if ((Suit4 < 0) ||
(Suit4 > Suit3)
) /* For
suit 4 to be valid
*/
continue;
/*
it must be >= 0 and <= suit 3. */
/*
If to here, suit counts are OK */
/*
Next, scan to see if suit
counts */
for (i = 0; i <=
13;
i++)
/*
have any duplicates. First
*/
Count[i] =
0;
/*
clear out any old garbage.
*/
Count[Suit1]++;
/*
Increment the count for the nbr */
Count[Suit2]++;
/*
of cards in each of the four
*/
Count[Suit3]++;
/*
suits.
*/
Count[Suit4]++;
/*
Initialize the suit permutation */
SuitComb =
24;
/* multiplier. Will check for
*/
for (i = 0; i <= 6; i++)
{
/*
duplicate quantities up through */
if (Count[i] >
1)
/*
6, 6, 1, 0 distribution.
*/
SuitComb /= FACT(Count[i]);
/* Adjust for
permutations of */
}
/*
identical counts
*/
/*
Here comes the big COMBIN() calc */
SuitComb *= COMBIN( 13,
Suit1) * COMBIN( 13, Suit2)
* COMBIN( 13, Suit3)*
COMBIN( 13, Suit4);
CalcTot +=
SuitComb;
/*
This must = COMBIN( 52, 13)
*/
/*
Print a row in the output table. */
/*
The format is left to the reader */
printf(" %2d, %2d, %2d, %2d
%20lf %g\n",
Suit1,
Suit2, Suit3, Suit4, SuitComb, SuitComb/635013559600.0);
}
/*
End of Suit3 loop
*/
}
/* End of Suit2 loop
*/
}
/* End of Suit1
loop
*/
And that's it. (It wasn't that difficult after all)
Return to
Bridge Combinatorics main page