#! perl -slw use strict; use List::Util qw[ sum min max ]; our $N ||= 10_000; our $MEAN ||= 75; sub skewedRnd { my( $start, $end, $skewedMean ) = @_; my $low = $skewedMean - $start; my $high = $end - $skewedMean; return ( rand() < 1 - ( $skewedMean / ( $end - $start ) ) ) ? $start + rand( $low ) : $skewedMean + rand( $high ); } my @values = map skewedRnd( 0, 100, $MEAN ), 1 .. $N; printf "range 0 .. 100; Min: %f Max:%f Mean:%f \n", min( @values ), max( @values ), sum( @values ) / $N; __END__ [23:52:06.41] P:\test>425761 -N=1000000 -MEAN=99 range 0 .. 100; Min: 0.003021 Max:99.999969 Mean:98.999126 [23:52:28.58] P:\test>425761 -N=1000 -MEAN=99 range 0 .. 100; Min: 5.154236 Max:99.997009 Mean:98.727916 [23:52:41.92] P:\test>425761 -N=1000 -MEAN=20 range 0 .. 100; Min: 0.029907 Max:99.995117 Mean:19.924415 [23:52:51.27] P:\test>425761 -N=1000 -MEAN=10 range 0 .. 100; Min: 0.008850 Max:97.561035 Mean:10.563889 [23:52:55.64] P:\test>425761 -N=1000 -MEAN=75 range 0 .. 100; Min: 0.144196 Max:99.998474 Mean:74.406415 [23:53:01.49] P:\test>425761 -N=1000 -MEAN=90 range 0 .. 100; Min: 1.606750 Max:99.976501 Mean:90.610480 [23:53:08.42] P:\test>425761 -N=1000 -MEAN=51 range 0 .. 100; Min: 0.049805 Max:99.974579 Mean:50.391814 [23:53:33.88] P:\test>425761 -N=1000 -MEAN=51 range 0 .. 100; Min: 0.221008 Max:99.923737 Mean:50.118810 [23:53:36.24] P:\test>425761 -N=10000 -MEAN=51 range 0 .. 100; Min: 0.001556 Max:99.998505 Mean:51.276380 [23:53:40.10] P:\test>425761 -N=100000 -MEAN=51 range 0 .. 100; Min: 0.000000 Max:99.997009 Mean:51.018693 [23:53:44.44] P:\test>425761 -N=1000000 -MEAN=51 range 0 .. 100; Min: 0.000000 Max:99.998505 Mean:50.992506 #### #! perl -slw use strict; our $N ||= 10_000; our $MEAN ||= 75; sub skewedRnd { my( $start, $end, $skewedMean ) = @_; my $skewFactor = $skewedMean - ( ( $end - $start ) / 2 ); return $start + rand( $end - $start ) + rand( $skewFactor * 2 ); } my $total; $total += skewedRnd( 0, 100, $MEAN ) for 1 .. $N; print $total / $N; __END__ [21:56:57.38] P:\test>425761 -N=100000 -MEAN=75 75.060163192749 [21:57:13.74] P:\test>425761 -N=100000 -MEAN=32 32.1195869335938