use strict; use warnings; use List::Util qw( sum ); use Readonly; Readonly my $NORM => 9.8316; # value @ 1179169191 test_votes_xp( $_ ) for 5, 10, 15, 20, 30, 40; sub test_votes_xp { my ( $count ) = @_; my $iterations = 100; print "Testing $count vote pairs\n"; printf "Alternating: %.2f avg XP gain\n", average_xp_from_votes( $iterations, [(+1, -1) x $count] ); printf "All up, then all down: %.2f avg XP gain\n", average_xp_from_votes( $iterations, [(+1) x $count, (-1) x $count] ); printf "All down, then all up: %.2f avg XP gain\n", average_xp_from_votes( $iterations, [(-1) x $count, (+1) x $count] ); print "\n"; } sub average_xp_from_votes { my ( $iterations, $votes_ref ) = @_; my @xp_changes; while ( $iterations-- > 0 ) { push @xp_changes, xp_from_votes( @{$votes_ref} ); } return ( sum @xp_changes ) / scalar @xp_changes; } sub xp_from_votes { my @votes = @_; my $rep = 0; my $xp_change = 0; foreach my $vote ( @votes ) { if ( $vote > 0 ) { if ( ( $NORM > $rep && rand() < 1/3 ) || ( $NORM <= $rep && $rep < 2*$NORM && rand() < 1/2 ) || ( 2*$NORM <= $rep && $rep < 3*$NORM && rand() < 2/3 ) || ( 3*$NORM <= $rep && $rep < 4*$NORM && rand() < 3/4 ) || 4*$NORM <= $rep ) { $xp_change += $vote; } } else { if ( ( $NORM > $rep && rand() < 1/3 ) || ( $NORM <= $rep && $rep < 2*$NORM && rand() < 1/3 ) || ( 2*$NORM <= $rep && $rep < 3*$NORM && rand() < 1/3 ) || ( 3*$NORM <= $rep && $rep < 4*$NORM && rand() < 1/4 ) ) { $xp_change += $vote; } } $rep += $vote; } return $xp_change; } __END__ Testing 5 vote pairs Alternating: -0.09 avg XP gain All up, then all down: -0.07 avg XP gain All down, then all up: 0.13 avg XP gain Testing 10 vote pairs Alternating: -0.16 avg XP gain All up, then all down: 0.11 avg XP gain All down, then all up: 0.39 avg XP gain Testing 15 vote pairs Alternating: -0.22 avg XP gain All up, then all down: 0.76 avg XP gain All down, then all up: 0.10 avg XP gain Testing 20 vote pairs Alternating: -0.28 avg XP gain All up, then all down: 1.65 avg XP gain All down, then all up: -0.07 avg XP gain Testing 30 vote pairs Alternating: -0.59 avg XP gain All up, then all down: 4.75 avg XP gain All down, then all up: 0.30 avg XP gain Testing 40 vote pairs Alternating: -0.59 avg XP gain All up, then all down: 10.63 avg XP gain All down, then all up: -0.16 avg XP gain