#!/usr/bin/perl -w # # Demonstrate the importance of "use warnings" and "use strict"! # 051004 liverpole # ############## ### Strict ### ############## use strict; use warnings; ################## ### Prototypes ### ################## sub ratio_change($$$$); sub random_change($); #################### ### Main program ### #################### my $start_value = my $new_value = 100; my $start_total = my $new_total = 1000; my $ratio0 = 100 * $start_value / $start_total; my $ratio1 = $ratio0; for (my $i = 0; $i < 100000; $i++) { if (ratio_change($start_value, $start_total, $new_value, $new_total)) { $ratio1 = $ratio1 = 100 * $new_value / $new_total; } $start_value = $new_value; $start_total = $new_total; $new_value = random_change($start_value); $new_total = random_change($start_total); } printf "Start percentage ... %7.4f%%\n", $ratio0; printf " End percentage ... %7.4f%%\n", $ratio1; ################### ### Subroutines ### ################### sub random_change($) { my ($value) = @_; (rand(100) > 0.005) and return $value; # No change 99.995% of the time return $value + int(rand(3)) - 1; # Make a change of -1, 0, or +1 } sub ratio_change($$$$) { my ($value0, $total0, $value1, $total1) = @_; my $ratio0 = $value0 / $total0; my $ratio1 = $value1 / $total1; ($ratio0 == $ratio1) and return 0; # No change in ratio my $text = "Ratio Change: $ratio0 => $ratio1\n"; print STDERR $text; return 1; }