#!/usr/bin/perl -w
use strict;
my $mystart = 0; # What is the minimum value of random numbers
+ you want to generate
my $myend = 100; # What is the maximum value of the random num
+bers to generate
my $count = 50; # How many numbers should be generated
my $my_average = 50; # What is the decided avarage of the generate
+d numbers
my $number;
my @number;
my $summ = 0;
my $i = 0;
my $real_average;
print "\nList of random values:\n";
for $i(1.. $count ){
my $start = $mystart;
my $end = $myend;
my $more = ($my_average*$count-$summ);
my $average = $more/(1+$count-$i);
if( ($count-$i)*$myend < $more-$mystart ){
$start = $more-($count-$i)*$myend;
}
if( ($count-$i)*$mystart > $more-$myend ){
$end = $more-($count-$i)*$mystart;
}
$number = random($start,$end,$average);
$summ += int $number;
$real_average = $summ / $i;
print "Random number: $number\n";
print "Average: $real_average\n\n";
}
sub random{
my($start,$end,$average) = @_;
# print "$start,$end,$average\n";
if( $start >= $end ){ return $average; }
my $b = ($average-$start)/($end-$start);
if( 0 ){
my $p = $b<=.5?1/$b-1:(1-$b)/$b; #Update: this was silly
return $start + ($end-$start)*(rand)**$p;
}else{#Update: smoother skew function
return $b >= 0.5 ?
$start + ($end-$start)*(rand)**(1/$b-1)
:
$end + ($start-$end)*(rand)**(1/(1-$b)-1)
;
}
}