#! perl -slw use strict; use Data::Dump qw[ pp ]; use List::Util qw[ shuffle sum ]; use constant TARGET => 100; sub pick { my( $scoresRef, $pickPoint ) = @_; my $n = 0; ( $n += $scoresRef->[ $_ ] ) > $pickPoint and return $_ for 0 .. $#{ $scoresRef } } sub score { my( $result ) = @_; return TARGET / ( TARGET + abs( TARGET - $result ) ) * 3; } my %stats; for( 1 .. 1e3 ) { my @results = shuffle map $_*10, 1 .. 19; my @scores = map score( $_ ), @results; my $total = sum @scores; for ( 1 .. 1000 ) { my $picked = pick( \@scores, rand( $total ) ); ++$stats{ $results[ $picked ] }; } } my $total = sum values %stats; for my $key ( sort{ $a <=> $b } keys %stats ) { printf "%3d : %6d (%.3f%%)\n", $key, $stats{ $key }, $stats{ $key } * 100 / $total; } __END__ c:\test>test.pl 10 : 39702 (3.970%) 20 : 41626 (4.163%) 30 : 44526 (4.453%) 40 : 47013 (4.701%) 50 : 49309 (4.931%) 60 : 53178 (5.318%) 70 : 57689 (5.769%) 80 : 62036 (6.204%) 90 : 67798 (6.780%) 100 : 74497 (7.450%) 110 : 67891 (6.789%) 120 : 62295 (6.229%) 130 : 57471 (5.747%) 140 : 53166 (5.317%) 150 : 49932 (4.993%) 160 : 47001 (4.700%) 170 : 43562 (4.356%) 180 : 41775 (4.178%) 190 : 39533 (3.953%)