summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl.straw/lib/Data/Random.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlperl.straw/lib/Data/Random.pm')
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Data/Random.pm850
1 files changed, 850 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl.straw/lib/Data/Random.pm b/Master/tlpkg/tlperl.straw/lib/Data/Random.pm
new file mode 100755
index 00000000000..f6e119fcf73
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Data/Random.pm
@@ -0,0 +1,850 @@
+################################################################################
+# Data::Random
+#
+# A module used to generate random data.
+################################################################################
+
+package Data::Random;
+
+################################################################################
+# - Modules and Libraries
+################################################################################
+#require 5.005_62;
+
+use lib qw(..);
+use Carp qw(cluck);
+
+#use Data::Random::WordList;
+
+require Exporter;
+
+################################################################################
+# - Global Constants and Variables
+################################################################################
+use vars qw(
+ @ISA
+ %EXPORT_TAGS
+ @EXPORT_OK
+ @EXPORT
+);
+
+@ISA = qw(Exporter);
+
+%EXPORT_TAGS = (
+ 'all' => [
+ qw(
+ rand_words
+ rand_chars
+ rand_set
+ rand_enum
+ rand_date
+ rand_time
+ rand_datetime
+ rand_image
+ )
+ ]
+);
+
+@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+@EXPORT = qw();
+
+$Data::Random::VERSION = '0.05';
+
+################################################################################
+# - Subroutines
+################################################################################
+
+################################################################################
+# rand_words()
+################################################################################
+sub rand_words {
+
+ # Get the options hash
+ my %options = @_;
+
+ # Initialize max and min vars
+ $options{'min'} ||= 1;
+ $options{'max'} ||= 1;
+
+ # Initialize the wordlist param
+ $options{'wordlist'} ||= '';
+
+ # Make sure the max and min vars are OK
+ cluck('min value cannot be larger than max value') && return
+ if $options{'min'} > $options{'max'};
+ cluck('min value must be a positive integer') && return
+ if $options{'min'} < 0 || $options{'min'} != int( $options{'min'} );
+ cluck('max value must be a positive integer') && return
+ if $options{'max'} < 0 || $options{'max'} != int( $options{'max'} );
+
+ # Initialize the size var
+ $options{'size'} ||=
+ int( rand( $options{'max'} - $options{'min'} + 1 ) ) + $options{'min'};
+
+ # Make sure the size var is OK
+ cluck('size value must be a positive integer') && return
+ if $options{'size'} < 0 || $options{'size'} != int( $options{'size'} );
+
+ # Initialize the shuffle flag
+ $options{'shuffle'} =
+ exists( $options{'shuffle'} ) ? $options{'shuffle'} : 1;
+
+ my $wl;
+ my $close_wl = 1;
+
+ # Check for a pre-existing wordlist object
+ if ( ref( $options{'wordlist'} ) ) {
+ $wl = $options{'wordlist'};
+ $close_wl = 0;
+ }
+ else {
+ require Data::Random::WordList;
+
+ # Create a new wordlist object
+ $wl = new Data::Random::WordList( wordlist => $options{'wordlist'} );
+ }
+
+ # Get the random words
+ my $rand_words = $wl->get_words( $options{'size'} );
+
+ # Close the word list
+ $wl->close() if $close_wl;
+
+ # Shuffle the words around
+ shuffle($rand_words) if $options{'shuffle'};
+
+# Return an array or an array reference, depending on the context in which the sub was called
+ if ( wantarray() ) {
+ return @$rand_words;
+ }
+ else {
+ return $rand_words;
+ }
+}
+
+################################################################################
+# rand_chars()
+################################################################################
+sub rand_chars {
+
+ # Get the options hash
+ my %options = @_;
+
+ # Build named character sets if one wasn't supplied
+ if ( ref( $options{'set'} ) ne 'ARRAY' ) {
+ my @charset = ();
+
+ if ( $options{'set'} eq 'all' ) {
+ @charset =
+ ( 0 .. 9, 'a' .. 'z', 'A' .. 'Z', '#', ',',
+ qw(~ ! @ $ % ^ & * ( ) _ + = - { } | : " < > ? / . ' ; ] [ \ `)
+ );
+ }
+ elsif ( $options{'set'} eq 'alpha' ) {
+ @charset = ( 'a' .. 'z', 'A' .. 'Z' );
+ }
+ elsif ( $options{'set'} eq 'upperalpha' ) {
+ @charset = ( 'A' .. 'Z' );
+ }
+ elsif ( $options{'set'} eq 'loweralpha' ) {
+ @charset = ( 'a' .. 'z' );
+ }
+ elsif ( $options{'set'} eq 'numeric' ) {
+ @charset = ( 0 .. 9 );
+ }
+ elsif ( $options{'set'} eq 'alphanumeric' ) {
+ @charset = ( 0 .. 9, 'a' .. 'z', 'A' .. 'Z' );
+ }
+ elsif ( $options{'set'} eq 'misc' ) {
+ @charset =
+ ( '#', ',',
+ qw(~ ! @ $ % ^ & * ( ) _ + = - { } | : " < > ? / . ' ; ] [ \ `)
+ );
+ }
+
+ $options{'set'} = \@charset;
+ }
+
+ return rand_set(%options);
+}
+
+################################################################################
+# rand_set()
+################################################################################
+sub rand_set {
+
+ # Get the options hash
+ my %options = @_;
+
+ # Make sure the set array was defined
+ cluck('set array is not defined') && return if !$options{'set'};
+
+ $options{'size'} = 1
+ unless exists( $options{'min'} ) || exists( $options{'max'} )
+ || exists( $options{'size'} );
+
+ # Initialize max and min vars
+ $options{'min'} ||= 0;
+ $options{'max'} ||= @{ $options{'set'} };
+
+ # Make sure the max and min vars are OK
+ cluck('min value cannot be larger than max value') && return
+ if $options{'min'} > $options{'max'};
+ cluck('min value must be a positive integer') && return
+ if $options{'min'} < 0 || $options{'min'} != int( $options{'min'} );
+ cluck('max value must be a positive integer') && return
+ if $options{'max'} < 0 || $options{'max'} != int( $options{'max'} );
+
+ # Initialize the size var
+ $options{'size'} ||=
+ int( rand( $options{'max'} - $options{'min'} + 1 ) ) + $options{'min'};
+
+ # Make sure the size var is OK
+ cluck('size value must be a positive integer') && return
+ if $options{'size'} < 0 || $options{'size'} != int( $options{'size'} );
+ cluck('size value exceeds set size') && return
+ if $options{'size'} > @{ $options{'set'} };
+
+ # Initialize the shuffle flag
+ $options{'shuffle'} =
+ exists( $options{'shuffle'} ) ? $options{'shuffle'} : 1;
+
+ # Get the random items
+ my %results = ();
+ for ( my $i = 0 ; $i < $options{'size'} ; $i++ ) {
+ my $result;
+
+ do {
+ $result = int( rand( @{ $options{'set'} } ) );
+ } while ( exists( $results{$result} ) );
+
+ $results{$result} = 1;
+ }
+
+ my @results = sort { $a <=> $b } keys %results;
+
+ # Shuffle the items
+ shuffle( \@results ) if $options{'shuffle'};
+
+# Return an array or an array reference, depending on the context in which the sub was called
+ if ( wantarray() ) {
+ return @{ $options{'set'} }[@results];
+ }
+ else {
+ return \@{ $options{'set'} }[@results];
+ }
+}
+
+################################################################################
+# rand_enum()
+################################################################################
+sub rand_enum {
+
+ # Get the options hash
+ my %options = @_;
+
+ # Make sure the set array was defined
+ cluck('set array is not defined') && return if !$options{'set'};
+
+ return $options{'set'}->[ int( rand( @{ $options{'set'} } ) ) ];
+}
+
+################################################################################
+# rand_date()
+################################################################################
+sub rand_date {
+
+ # Get the options hash
+ my %options = @_;
+
+ # use the Date::Calc module
+ eval q{ use Date::Calc };
+
+ cluck($@) && return if $@;
+
+ my ( $min_year, $min_month, $min_day, $max_year, $max_month, $max_day );
+
+ # Get today's date
+ my ( $year, $month, $day ) = Date::Calc::Today();
+
+ if ( $options{'min'} ) {
+ if ( $options{'min'} eq 'now' ) {
+ ( $min_year, $min_month, $min_day ) = ( $year, $month, $day );
+ }
+ else {
+ ( $min_year, $min_month, $min_day ) =
+ split ( /\-/, $options{'min'} );
+ }
+ }
+ else {
+ ( $min_year, $min_month, $min_day ) = ( $year, $month, $day );
+ }
+
+ if ( $options{'max'} ) {
+ if ( $options{'max'} eq 'now' ) {
+ ( $max_year, $max_month, $max_day ) = ( $year, $month, $day );
+ }
+ else {
+ ( $max_year, $max_month, $max_day ) =
+ split ( /\-/, $options{'max'} );
+ }
+ }
+ else {
+ ( $max_year, $max_month, $max_day ) =
+ Date::Calc::Add_Delta_YMD( $min_year, $min_month, $min_day, 1, 0, 0 );
+ }
+
+ my $delta_days =
+ Date::Calc::Delta_Days( $min_year, $min_month, $min_day, $max_year,
+ $max_month, $max_day, );
+
+ cluck('max date is later than min date') && return if $delta_days < 0;
+
+ $delta_days = int( rand( $delta_days + 1 ) );
+
+ ( $year, $month, $day ) =
+ Date::Calc::Add_Delta_Days( $min_year, $min_month, $min_day,
+ $delta_days );
+
+ return sprintf( "%04u-%02u-%02u", $year, $month, $day );
+}
+
+################################################################################
+# rand_time()
+################################################################################
+sub rand_time {
+
+ # Get the options hash
+ my %options = @_;
+
+ my ( $min_hour, $min_min, $min_sec, $max_hour, $max_min, $max_sec );
+
+ if ( $options{'min'} ) {
+ if ( $options{'min'} eq 'now' ) {
+
+ # Get the current time
+ my ( $hour, $min, $sec ) = ( localtime() )[ 2, 1, 0 ];
+
+ ( $min_hour, $min_min, $min_sec ) = ( $hour, $min, $sec );
+ }
+ else {
+ ( $min_hour, $min_min, $min_sec ) = split ( /\:/, $options{'min'} );
+
+ cluck('minimum time is not in valid time format HH:MM:SS') && return
+ if ( $min_hour > 23 ) || ( $min_hour < 0 );
+ cluck('minimum time is not in valid time format HH:MM:SS') && return
+ if ( $min_min > 59 ) || ( $min_min < 0 );
+ cluck('minimum time is not in valid time format HH:MM:SS') && return
+ if ( $min_sec > 59 ) || ( $min_sec < 0 );
+ }
+ }
+ else {
+ ( $min_hour, $min_min, $min_sec ) = ( 0, 0, 0 );
+ }
+
+ if ( $options{'max'} ) {
+ if ( $options{'max'} eq 'now' ) {
+
+ # Get the current time
+ my ( $hour, $min, $sec ) = ( localtime() )[ 2, 1, 0 ];
+
+ ( $max_hour, $max_min, $max_sec ) = ( $hour, $min, $sec );
+ }
+ else {
+ ( $max_hour, $max_min, $max_sec ) = split ( /\:/, $options{'max'} );
+
+ cluck('maximum time is not in valid time format HH:MM:SS') && return
+ if ( $max_hour > 23 ) || ( $max_hour < 0 );
+ cluck('maximum time is not in valid time format HH:MM:SS') && return
+ if ( $max_min > 59 ) || ( $max_min < 0 );
+ cluck('maximum time is not in valid time format HH:MM:SS') && return
+ if ( $max_sec > 59 ) || ( $max_sec < 0 );
+ }
+ }
+ else {
+ ( $max_hour, $max_min, $max_sec ) = ( 23, 59, 59 );
+ }
+
+ my $min_secs = $min_hour * 3600 + $min_min * 60 + $min_sec;
+ my $max_secs = ( $max_hour * 3600 ) + ( $max_min * 60 ) + $max_sec;
+
+ my $delta_secs = $max_secs - $min_secs;
+
+ cluck('min time is later than max time') && return if $delta_secs < 0;
+
+ $delta_secs = int( rand( $delta_secs + 1 ) );
+
+ my $result_secs = $min_secs + $delta_secs;
+
+ my $hour = int( $result_secs / 3600 );
+ my $min = int( ( $result_secs - ( $hour * 3600 ) ) / 60 );
+ my $sec = $result_secs % 60;
+
+ return sprintf( "%02u:%02u:%02u", $hour, $min, $sec );
+}
+
+################################################################################
+# rand_datetime()
+################################################################################
+sub rand_datetime {
+
+ # Get the options hash
+ my %options = @_;
+
+ # use the Date::Calc module
+ eval q{ use Date::Calc };
+
+ cluck($@) && return if $@;
+
+ my (
+ $min_year, $min_month, $min_day, $min_hour, $min_min, $min_sec,
+ $max_year, $max_month, $max_day, $max_hour, $max_min, $max_sec
+ );
+
+ # Get today's date
+ my ( $year, $month, $day, $hour, $min, $sec ) = Date::Calc::Today_and_Now();
+
+ if ( $options{'min'} ) {
+ if ( $options{'min'} eq 'now' ) {
+ ( $min_year, $min_month, $min_day,
+ $min_hour, $min_min, $min_sec )
+ = ( $year, $month, $day, $hour, $min, $sec );
+ }
+ else {
+ ( $min_year, $min_month, $min_day,
+ $min_hour, $min_min, $min_sec )
+ = $options{'min'} =~ /^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)$/;
+ }
+ }
+ else {
+ ( $min_year, $min_month, $min_day, $min_hour, $min_min, $min_sec ) =
+ ( $year, $month, $day, 0, 0, 0 );
+ }
+
+ if ( $options{'max'} ) {
+ if ( $options{'max'} eq 'now' ) {
+ ( $max_year, $max_month, $max_day,
+ $max_hour, $max_min, $max_sec )
+ = ( $year, $month, $day, $hour, $min, $sec );
+ }
+ else {
+ ( $max_year, $max_month, $max_day,
+ $max_hour, $max_min, $max_sec )
+ = $options{'max'} =~ /^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)$/;
+ }
+ }
+ else {
+ ( $max_year, $max_month, $max_day, $max_hour, $max_min, $max_sec ) =
+ ( Date::Calc::Add_Delta_YMD( $min_year, $min_month, $min_day, 1, 0,
+ 0 ), 23, 59, 59 );
+ }
+
+ my ( $delta_days, $delta_hours, $delta_mins, $delta_secs ) =
+ Date::Calc::Delta_DHMS(
+ $min_year, $min_month, $min_day, $min_hour, $min_min, $min_sec,
+ $max_year, $max_month, $max_day, $max_hour, $max_min, $max_sec,
+ );
+
+ cluck('max date is later than min date') && return
+ if ( $delta_days < 0 ) || ( $delta_hours < 0 ) || ( $delta_mins < 0 )
+ || ( $delta_secs < 0 );
+
+ $delta_secs =
+ ( $delta_days * 86400 ) + ( $delta_hours * 3600 ) + ( $delta_mins * 60 ) +
+ $delta_secs;
+
+ $delta_secs = int( rand( $delta_secs + 1 ) );
+
+ ( $year, $month, $day, $hour, $min, $sec ) = Date::Calc::Add_Delta_DHMS(
+ $min_year, $min_month, $min_day, $min_hour,
+ $min_min, $min_sec, 0, 0,
+ 0, $delta_secs
+ );
+
+ return
+ sprintf( "%04u-%02u-%02u %02u:%02u:%02u", $year, $month, $day, $hour,
+ $min, $sec );
+}
+
+################################################################################
+# rand_image()
+################################################################################
+sub rand_image {
+
+ # Get the options hash
+ my %options = @_;
+
+ $options{'minwidth'} ||= 1;
+ $options{'maxwidth'} ||= 100;
+ $options{'width'} ||=
+ int( rand( $options{'maxwidth'} - $options{'minwidth'} + 1 ) ) +
+ $options{'minwidth'};
+
+ $options{'minheight'} ||= 1;
+ $options{'maxheight'} ||= 100;
+ $options{'height'} ||=
+ int( rand( $options{'maxheight'} - $options{'minheight'} + 1 ) ) +
+ $options{'minheight'};
+
+ $options{'minpixels'} ||= 0;
+ $options{'maxpixels'} ||= $options{'width'} * $options{'height'};
+ $options{'pixels'} ||=
+ int( rand( $options{'maxpixels'} - $options{'minpixels'} + 1 ) ) +
+ $options{'minpixels'};
+
+ $options{'bgcolor'} ||= _color();
+ $options{'fgcolor'} ||= _color();
+
+ eval q{ use GD; };
+
+ cluck($@) && return if $@;
+
+ my $image = new GD::Image( $options{'width'}, $options{'height'} );
+
+ my $bgcolor = $image->colorAllocate( @{ $options{'bgcolor'} } );
+ my $fgcolor = $image->colorAllocate( @{ $options{'fgcolor'} } );
+
+ $image->rectangle( 0, 0, $options{'width'}, $options{'height'}, $bgcolor );
+
+ for ( my $i = 0 ; $i < $options{'pixels'} ; $i++ ) {
+ my $x = int( rand( $options{'width'} + 1 ) );
+ my $y = int( rand( $options{'height'} + 1 ) );
+
+ $image->setPixel( $x, $y, $fgcolor );
+ }
+
+ return $image->png();
+
+ sub _color {
+ return [ int( rand(266) ), int( rand(266) ), int( rand(266) ) ];
+ }
+}
+
+################################################################################
+# shuffle()
+################################################################################
+sub shuffle {
+ my $array = shift;
+
+ for ( my $i = @$array - 1 ; $i >= 0 ; $i-- ) {
+ my $j = int( rand( $i + 1 ) );
+
+ @$array[ $i, $j ] = @$array[ $j, $i ] if $i != $j;
+ }
+}
+
+1;
+
+=head1 NAME
+
+Data::Random - Perl module to generate random data
+
+
+=head1 SYNOPSIS
+
+ use Data::Random qw(:all);
+
+ my @random_words = rand_words( size => 10 );
+
+ my @random_chars = rand_chars( set => 'all', min => 5, max => 8 );
+
+ my @random_set = rand_set( set => \@set, size => 5 );
+
+ my $random_enum = rand_enum( set => \@set );
+
+ my $random_date = rand_date();
+
+ my $random_time = rand_time();
+
+ my $random_datetime = rand_datetime();
+
+ open(FILE, ">rand_image.png") or die $!;
+ binmode(FILE);
+ print FILE rand_image( bgcolor => [0, 0, 0] );
+ close(FILE);
+
+
+=head1 DESCRIPTION
+
+A module used to generate random data. Useful mostly for test programs.
+
+
+=head1 METHODS
+
+=head2 rand_words()
+
+This returns a list of random words given a wordlist. See below for possible parameters.
+
+=over 4
+
+=item *
+
+wordlist - the path to the wordlist file. A lot of systems have one at /usr/dict/words. You can also optionally supply a Data::Random::WordList object to keep a persistent wordlist. The default is the wordlist distributed with this module.
+
+=item *
+
+min - the minimum number of words to return. The default is 1.
+
+=item *
+
+max - the maximum number of words to return. The default is 1.
+
+=item *
+
+size - the number of words to return. The default is 1. If you supply a value for 'size', then 'min' and 'max' aren't paid attention to.
+
+=item *
+
+shuffle - whether or not the words should be randomly shuffled. Set this to 0 if you don't want the words shuffled. The default is 1. Random::Data::WordList returns words in the order that they're viewed in the word list file, so shuffling will make sure that the results are a little more random.
+
+=back 4
+
+
+=head2 rand_chars()
+
+This returns a list of random characters given a set of characters. See below for possible parameters.
+
+=over 4
+
+=item *
+
+set - the set of characters to be used. This value can be either a reference to an array of strings, or one of the following:
+
+ alpha - alphabetic characters: a-z, A-Z
+ upperalpha - upper case alphabetic characters: A-Z
+ loweralpha - lower case alphabetic characters: a-z
+ numeric - numeric characters: 0-9
+ alphanumeric - alphanumeric characters: a-z, A-Z, 0-9
+ char - non-alphanumeric characters: # ~ ! @ $ % ^ & * ( ) _ + = - { } | : " < > ? / . ' ; ] [ \ `
+ all - all of the above
+
+=item *
+
+min - the minimum number of characters to return. The default is 0.
+
+=item *
+
+max - the maximum number of characters to return. The default is the size of the set.
+
+=item *
+
+size - the number of characters to return. The default is 1. If you supply a value for 'size', then 'min' and 'max' aren't paid attention to.
+
+=item *
+
+shuffle - whether or not the characters should be randomly shuffled. Set this to 0 if you want the characters to stay in the order received. The default is 1.
+
+=back 4
+
+
+=head2 rand_set()
+
+This returns a random set of elements given an initial set. See below for possible parameters.
+
+=over 4
+
+=item *
+
+set - the set of strings to be used. This should be a reference to an array of strings.
+
+=item *
+
+min - the minimum number of strings to return. The default is 0.
+
+=item *
+
+max - the maximum number of strings to return. The default is the size of the set.
+
+=item *
+
+size - the number of strings to return. The default is 1. If you supply a value for 'size', then 'min' and 'max' aren't paid attention to.
+
+=item *
+
+shuffle - whether or not the strings should be randomly shuffled. Set this to 0 if you want the strings to stay in the order received. The default is 1.
+
+=back 4
+
+
+=head2 rand_enum()
+
+This returns a random element given an initial set. See below for possible parameters.
+
+=over 4
+
+=item *
+
+set - the set of strings to be used. This should be a reference to an array of strings.
+
+=back 4
+
+
+=head2 rand_date()
+
+This returns a random date in the form "YYYY-MM-DD". 2-digit years are not currently supported. Efforts are made to make sure you're returned a truly valid date--ie, you'll never be returned the date February 31st. See the options below to find out how to control the date range. Here are a few examples:
+
+ # returns a date somewhere in between the current date, and one year from the current date
+ $date = rand_date();
+
+ # returns a date somewhere in between September 21, 1978 and September 21, 1979
+ $date = rand_date( min => '1978-9-21' );
+
+ # returns a date somewhere in between September 21, 1978 and the current date
+ $date = rand_date( min => '1978-9-21', max => 'now' );
+
+ # returns a date somewhere in between the current date and September 21, 2008
+ $date = rand_date( min => 'now', max => '2008-9-21' );
+
+See below for possible parameters.
+
+=over 4
+
+=item *
+
+min - the minimum date to be returned. It should be in the form "YYYY-MM-DD" or you can alternatively use the string "now" to represent the current date. The default is the current date;
+
+=item *
+
+max - the maximum date to be returned. It should be in the form "YYYY-MM-DD" or you can alternatively use the string "now" to represent the current date. The default is one year from the minimum date;
+
+=back 4
+
+
+=head2 rand_time()
+
+This returns a random time in the form "HH:MM:SS". 24 hour times are supported. See the options below to find out how to control the time range. Here are a few examples:
+
+ # returns a random 24-hr time (between 00:00:00 and 23:59:59)
+ $time = rand_time();
+
+ # returns a time somewhere in between 04:00:00 and the end of the day
+ $time = rand_time( min => '4:0:0' );
+
+ # returns a time somewhere in between 8:00:00 and the current time (if it's after 8:00)
+ $time = rand_time( min => '12:00:00', max => 'now' );
+
+ # returns a date somewhere in between the current time and the end of the day
+ $time = rand_time( min => 'now' );
+
+See below for possible parameters.
+
+=over 4
+
+=item *
+
+min - the minimum time to be returned. It should be in the form "HH:MM:SS" or you can alternatively use the string "now" to represent the current time. The default is 00:00:00;
+
+=item *
+
+max - the maximum time to be returned. It should be in the form "HH:MM:SS" or you can alternatively use the string "now" to represent the current time. The default is 23:59:59;
+
+=back 4
+
+
+=head2 rand_datetime()
+
+This returns a random date and time in the form "YYYY-MM-DD HH:MM:SS". See the options below to find out how to control the date/time range. Here are a few examples:
+
+ # returns a date somewhere in between the current date/time, and one year from the current date/time
+ $datetime = rand_datetime();
+
+ # returns a date somewhere in between 4:00 September 21, 1978 and 4:00 September 21, 1979
+ $datetime = rand_datetime( min => '1978-9-21 4:0:0' );
+
+ # returns a date somewhere in between 4:00 September 21, 1978 and the current date
+ $datetime = rand_datetime( min => '1978-9-21 4:0:0', max => 'now' );
+
+ # returns a date somewhere in between the current date/time and the end of the day September 21, 2008
+ $datetime = rand_datetime( min => 'now', max => '2008-9-21 23:59:59' );
+
+See below for possible parameters.
+
+=over 4
+
+=item *
+
+min - the minimum date/time to be returned. It should be in the form "YYYY-MM-DD HH:MM:SS" or you can alternatively use the string "now" to represent the current date/time. The default is the current date/time;
+
+=item *
+
+max - the maximum date/time to be returned. It should be in the form "YYYY-MM-DD HH:MM:SS" or you can alternatively use the string "now" to represent the current date/time. The default is one year from the minimum date/time;
+
+=back 4
+
+
+=head2 rand_image()
+
+This returns a random image. Currently only PNG images are supported. See below for possible parameters.
+
+=over 4
+
+=item *
+
+minwidth - the minimum width of the image. The default is 1.
+
+=item *
+
+maxwidth - the maximum width of the image. The default is 100.
+
+=item *
+
+width - the width of the image. If you supply a value for 'width', then 'minwidth' and 'maxwidth' aren't paid attention to.
+
+=item *
+
+minheight - the minimum height of the image. The default is 1.
+
+=item *
+
+maxheight - the maximum height of the image. The default is 100.
+
+=item *
+
+height - the height of the image. If you supply a value for 'width', then 'minwidth' and 'maxwidth' aren't paid attention to.
+
+=item *
+
+minpixels - the minimum number of random pixels to display on the image. The default is 0.
+
+=item *
+
+maxpixels - the maximum number of random pixels to display on the image. The default is width * height.
+
+=item *
+
+pixels - the number of random pixels to display on the image. If you supply a value for 'pixels', then 'minpixels' and 'maxpixels' aren't paid attention to.
+
+=item *
+
+bgcolor - the background color of the image. The value must be a reference to an RGB array where each element is an integer between 0 and 255 (eg. [ 55, 120, 255 ]).
+
+=item *
+
+fgcolor - the foreground color of the image. The value must be a reference to an RGB array where each element is an integer between 0 and 255 (eg. [ 55, 120, 255 ]).
+
+=back 4
+
+
+=head1 VERSION
+
+0.05
+
+=head1 AUTHOR
+
+Adekunle Olonoh, koolade@users.sourceforge.net
+
+=head1 CREDITS
+
+Hiroki Chalfant
+David Sarno
+
+=head1 COPYRIGHT
+
+Copyright (c) 2000 Adekunle Olonoh. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+Data::Random::WordList
+
+=cut
+