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) = ---------------------
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:
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.
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.
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:
-b 5 4 52
-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.