#! 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%)