#! 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%)
####
sub score {
my( $result ) = @_;
return 1 / abs( ( TARGET - $result ) || 1 );
}
####
c:\test>867119-test.pl
10 : 7211 (0.721%)
20 : 8070 (0.807%)
30 : 8996 (0.900%)
40 : 10694 (1.069%)
50 : 12714 (1.271%)
60 : 16248 (1.625%)
70 : 21447 (2.145%)
80 : 32136 (3.214%)
90 : 63858 (6.386%)
100 : 637874 (63.787%)
110 : 63625 (6.362%)
120 : 32076 (3.208%)
130 : 21244 (2.124%)
140 : 15976 (1.598%)
150 : 12790 (1.279%)
160 : 10716 (1.072%)
170 : 9298 (0.930%)
180 : 7958 (0.796%)
190 : 7069 (0.707%)