Games-Dice-Probability

 view release on metacpan or  search on metacpan

lib/Games/Dice/Probability.pm  view on Meta::CPAN

    ($minval, $maxval) = $diceobj->bounds();
    $minval = $diceobj->min();
    $maxval = $diceobj->max();
    $tvcombs = $diceobj->combinations($targetvalue);
    $totalcombs = $diceobj->combinations();
    $prob = $diceobj->probability();
    $tvprob = $diceobj->probability($targetvalue);
    $dist = $diceobj->distribution();

    # table of value - combinations / total combinations
    foreach $value ($minval..$maxval) {
        print $value . " - " . $$dist{$value} . " / " . $$prob{$value} . "\n";
    }

=head1 DESCRIPTION

Games::Dice::Probability calculates probabilities and distributions for complex
dice expressions.  The expression provided when creating a new object is
parsed, and each node's combinations distribution is computed and then combined
appropriately to create the combinations distribution for the full expression.

Dice expressions are in the form of nDs or MIDs, where n is the number of dice 
and s is the number of faces on each die.  D is the simple-sum dice method, the
one most commonly used, where n dice of s faces each are rolled and a sum is
taken of the outcomes.  MID is the middle-value dice method, where three dice
are rolled, and the value in the middle is taken as the result.

For example, a single six-sided die is notated as:

    1d6

Two such dice would be:

    2d6

Middle dice would be:

    mid6

or:

    mid20

And so on.  Complex dice expressions can include modifiers (addition, 
subtraction, multiplication, division), and order of precedence brackets, such as:

    (2d6+4) + 2d6

or:

    (3d6/2) * 2d4

or:

    mid20 + (mid6+1)

When the object is created, the full distribution is calculated using as many
shortcuts and optimizations as possible.  These include reducing logic based on
certain values of n, only calculating half of any standard distribution, and
using an identity to create the other "mirrored" half of the distribution.
Also, large-number math is reduced by using formulae that reduce the
calculations to much smaller numbers, including the very efficient binomial
coefficient method in Math::Symbolic::AuxFunctions.  Lastly, each node's
distribution calculation and multi-node combined distribution calculation can
be Memoized, negating nearly all compute cycles for future identical
calculations.  All of these combined create a very sleek and fast method of
calculating dice distributions.

Memoization for calculations can be disabled at the time you declare use of
this module by passing an argument:

    use Games::Dice::Probability q/ nomemoize /;

The argument is recognized by 'no' or 'un' prefixed to 'memo' or 'memoize.'
Memoization is strongly encouraged when using this module for multiple
calculations or long-term scripts; the savings in compute cycles are vast.

Future support for BigInt is being considered, to allow for even larger values
in the complex dice expressions.

=head1 EXPORT

None.  This is intentional.  In fact, there is a faux import() call used
to optionally turn Memoize off, so exporting anything will not be successful.

=head1 SEE ALSO

Requires Math::Symbolic::AuxFunctions for the use of binomial_coeff().

Requires Parse::RecDescent to parse dice expressions.

Optionally uses Debug::ShowStuff to descend and display hashes in the object.

Optionally uses Memoize to speed up calculations of identical nodes in a dice
expression tree.  Use of memoization, though automatic, can be disabled when
using this module.

Up to date information on this module can be obtained from its webpage:

    http://oddgeek.info/code/gdp/

=head1 AUTHOR

Jason A. Dour, E<lt>jad@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2005 by Jason A. Dour

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.6 or,
at your option, any later version of Perl 5 you may have available.

=cut



( run in 0.775 second using v1.01-cache-2.11-cpan-d8267643d1d )