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 )