deal — compute and display deal probabilities


deal [-h ] [-b base] [-t turns] [-c columns] [-g ] [-w ] specials total


This program prints out tables of non-replacement draw probabilities, rounded to the nearest percent.

Suppose I have M special cards in my deck and N total cards in my deck, and I draw k cards from that deck without replacement. Let X count the number of special cards contained in those k drawn cards.

Then X has a hypergeometric distribution, with the following formula for probabilities:

                B(M, i) * B(N-M, k-i)
     P(X = i) = ---------------------
                      B(N, k)

where B(a,b) is the binomial coefficient (read "a choose b"), and is the number of ways to choose b objects out of a possible objects. The formula for the binomial coefficient is:

B(n,m) = n!/(m! * (n-m)!)

where n! is the factorial function n! = 1 * 2 * 3 * ... * n.

This program prints out tables of these probabilities. The `specials' and `total' arguments specify M and N. The table displays values for ranges of k and i.

In the table output, a dot designates a probability less than .5% that rounds to zero. Impossible outcomes are blank.

The program accepts the following options to control its output:

-b base

Number of cards to assume in the initial hand. Note: this defaults to 7, not to 0!


Normally, the program displays the probability that you will have exactly a given number of specials. With this option, it displays the odds that you will have the given number of specials or more. This option also forces -w on, to accomodate 100% probabilities which will show up in column 0 if nowhere else.


Force wide display (3 chars per percentage) to accommodate 100% probabilities.

-c columns

Number of table columns to generate in the report. Defaults to the number of specials plus one additional to accommodate the zero column.


Suppress table headers and legends.

-t draws

Set number of draws to display probabilities for (default to 20 or the total number of cards, whichever is less)


Verbose. Log the computation steps for each hypergeometricoefficient to standard error. Use this for debugging if you are a trained numerical analyst (kids, don't try this yourselves at home!).


Binomial coefficient test. Compute and print the binomial coefficient B(n, k) or `n choose k'.


Gamma function test. Compute and display the log of the gamma function of the argument. If -v tells you that the computation of B(n, k) is blowing up, this will enable you to probe the local lgamma function.


Compute the hypergeometric probability H(i, k, M, N) with arguments supplied from the command line. For debugging.


To compute the probabilities for drawing your 3 Hurloon Minotaurs during the first 20 turns from a 62-card "Magic: The Gathering" deck (MtG starts you with 7 cards):

deal 3 62

To compute your chances of having the 4 aces on the nth draw in 5-card draw poker:

deal -b 5 4 52


The -w and -g options widen the column width of the tables to accommodate 100% probabilities, at the cost of making the table too wide to display on an 80-column terminal when the number of specials is more than 17. When wide display is off, on the other hand, 23 specials will fit in 80 colums, but 100% probabilities can mess up the table formatting.


Eric S. Raymond . Based on the `cardprobs' program by Jeremy York. See my home page at for updates and other resources.