The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

PDL::RandVar -- Random number sequences.

VERSION

This document refers to version 1.0 of RandVar

SYNOPSIS

  use PDL::RandVar;

  $m = new PDL::RandVar(<dims>,<options>)

DESCRIPTION

This package implements random variable streams with various options. It provides a uniform interface to (hopefully, eventually) a wide variety of random and pseudo-random number generators. The base class uses a uniformly distributed engine (currently just perl's own rand function), and subclasses generate different distributions.

Once you've declared a random variable, you can get out samples with the explicit ->sample method. Eventually, sampling will be made implicit, so that you can just include random variables in expressions when you want a sample per element of the expression, or use ->sample for more complex sampling.

RandVar is designed for easy subclassing. You need only implement ->sample and ->new to get a new class.

When you ``use PDL::RandVar'' you also get some standard subclasses. They're pretty cheap to load. When you use RandVar, the following classes are also automagically loaded (and have their own documentation):

RandVar::Sobol

Subrandom sequences that help some types of algorithm converge faster.

RandVar::Histogram

Arbitarily distributed random variables.

RandVar::Gaussian

Gaussian distributions.

History

  0.01     4-Dec-2001 -- Basic functionality (CED)
  1.0      9-Jan-2002 -- seems to work OK (CED)

Author, license, no warranty

This file copyright(C) 2001, 2002 Craig DeForest (cdeforest@solar.stanford.edu). This software/documentation may be distributed under the same terms as PDL itself (license available at http://pdl.perl.org). This package comes with NO WARRANTY.

Bugs:

At the moment, repeatability by seeding is not implemented. More work needs to be done to get reproducible sequences.

To Do:

Implement repeatable sequences

(see Bugs)

Make RVs act more like pdls

ideally you ought to be able to declare a variable as a RandVar, and then use it in expressions to get samples automagically on-demand, without explicitly calling ->sample, ie ($a * $randvar) ought to do the Right Thing. The random variable ought to draw as many samples as needed for context (e.g. zeroes(100,200)+$randvar out to get 20,000 samples); if you want fewer, you can fall back on ->sample to specify how many (e.g. zeroes(100,200)+$randvar->sample(100) gets 100 samples and automagically threads over the 200 dimension).

This gets implemented at the top level -- subclasses need only implement sample() and RandVar should handle the rest.

Tie in the Gnu library

The gnu random variable functions are extensive and just need tiny wrappers to turn into subclasses.

FUNCTIONS

new

Construct a uniformly distributed random variable.

  Signature: (size())
  $a = new RandVar(<size>,<opt>);

Options:

range

2xn piddle containing min and max values for each dimension of the R.V.

seed

A number to use as the seed. If omitted, then the system clock is used. (Not implemented at this level but placed here as a hook)

  $xyrand = new RandVar(2,{range=>pdl([$xmin,$xmax],[$ymin,$ymax])});
  $newxy = sample $xyrand;

Return one or more samples of the random variable

This is a pretty stoopid implementation -- it just calls the perl rand() function a bunch of times and is here primarily to get the ball rolling on the object.

 Signature: sample(n(),[o]out(d,n))
 
 You can pass in an output pdl to avoid having to reallocate each time.
  $out = <RandVar>->sample(<n>);
  $rv = new RandVar;
  $samps = $rv->sample(10);

You get back an <n>x<d> array, where <n> is the number of samples you ask for and <d> is the dimension of the random variable. This may seeem transposed but it allows you to drop the last dimension if your variable is a scalar.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 208:

=pod directives shouldn't be over one line long! Ignoring all 2 lines of content