# Filename: Rand/MersenneTwister.pm # Author: George Schlossnagle # Theo Schlossnagle # Created: 03 October 2002 # Version: 1.0.1 # # Copyright (c) OmniTI Computer Consulting, Inc. All rights reserved. # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # # package Rand::MersenneTwister; require 5.004; require Exporter; require DynaLoader; require AutoLoader; use Carp; use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); $VERSION = "1.0.1" ; @ISA = qw(Exporter DynaLoader); %EXPORT_TAGS = ( FUNCS => [ qw(mt_init mt_free mt_seed mt_rand) ], ); @EXPORT = qw( ERROR ); @EXPORT_OK = qw( mt_init mt_free mt_seed mt_rand); sub AUTOLOAD { # This AUTOLOAD is used to 'autoload' constants from the constant() # XS function. If a constant is not found then control is passed # to the AUTOLOAD in AutoLoader. my $constname; ($constname = $AUTOLOAD) =~ s/.*:://; my $val = constant($constname, @_ ? $_[0] : 0); if ($! != 0) { if ($! =~ /Invalid/) { $AutoLoader::AUTOLOAD = $AUTOLOAD; goto &AutoLoader::AUTOLOAD; } else { croak "Your vendor has not defined Rand::MersenneTwister macro $constname"; } } eval "sub $AUTOLOAD { \"$val\" }"; goto &$AUTOLOAD; } bootstrap Rand::MersenneTwister $VERSION ; sub new { my $self = shift; my $class = ref($self) || $self; my $td = mt_init(); my $obj = bless { GEN => $td }, $class; if(@_) { $obj->seed(@_); } return $obj; } sub seed { my($self, $seed) = @_; $seed ||= time*$$*100000; mt_seed($self->{GEN}, $seed); } sub rand { my $self = shift; return mt_rand($self->{GEN}, @_); } sub DESTROY { my($self) = shift; mt_free($self->{GEN}); } 1; __END__ =head1 NAME Mcrypt - Perl extension for a Mersenne Twister PRGN implementation with context. =head1 SYNOPSIS use Rand::MersenneTwister; # Object-oriented methods # New object context optionally seeded. $r = Rand::MersenneTwister->new( [$seed] ); # Seed or reseed this PRNG context. $r->seed($number); # fetch the next random number in the sequance. # between 0 and 1 my $random_number = $r->rand; # between 0 and $v my $random_number = $r->rand($v); # If the $r goes out of context, it is freed. =head1 DESCRIPTION This module wraps a fast, C implementation of a Mersenne Twister-based PRNG. =head1 Exported constants The predefined groups of exports in the use statements are as follows: use Rand::MersenneTwister; Exports the following functions: mt_init, mt_free, mt_seed, mt_rand. =head1 EXAMPLES use Rand::MersenneTwister; my $r = Rand::MersenneTwister->new(); $r->seed(); my $randmon_number = $r->rand(100); =head1 AUTHOR George Schlossnagle Theo Schlossnagle =head1 SEE ALSO http://www.math.keio.ac.jp/~matumoto/mt.html For the less worldly: http://www.math.keio.ac.jp/~matumoto/emt.html =cut