Statistics-Distribution-Generator
view release on metacpan or search on metacpan
lib/Statistics/Distribution/Generator.pm view on Meta::CPAN
package Statistics::Distribution::Generator;
use 5.010;
BEGIN {
if ($] lt '5.012') {
use strict;
use warnings;
}
}
use overload (
'0+' => '_render',
'""' => '_render',
'@{}' => '_render',
'|' => '_add_alternative',
'x' => '_add_dimension',
fallback => 1,
);
use List::AllUtils qw( reduce );
use Exporter qw( import );
use vars qw( $VERSION );
$VERSION = '1.003';
sub logistic ();
our @EXPORT_OK = qw( gaussian uniform logistic supplied gamma exponential dice );
our %EXPORT_TAGS = (all => \@EXPORT_OK);
our $pi = 3.1415926535897932384626433832795028841971693993751;
our $two_pi = 2 * $pi;
our $e = exp 1;
sub _render {
my $self = shift;
if ($self->{ dims }) {
return [ map { $_->_render } @{$self->{ dims }} ];
}
elsif ($self->{ alts }) {
my $accum = reduce { $a + $b } map { $_->{ weight } // 1 } @{$self->{ alts }};
my $n = rand() * $accum;
my $answer;
for my $alt (@{$self->{ alts }}) {
$n -= ($alt->{ weight } // 1);
if ($n <= 0) {
$answer = $alt->_render;
last;
}
}
return $answer;
}
die("Can't render a(n) " . (ref($self)||$self));
}
sub gaussian {
my ($mean, $sigma) = @_;
$mean //= 0;
$sigma //= 1;
return bless { mean => $mean, sigma => $sigma }, 'Statistics::Distribution::Generator::gaussian';
}
sub uniform {
my ($min, $max) = @_;
$min //= 0;
( run in 2.623 seconds using v1.01-cache-2.11-cpan-a49fcb8fa48 )