use strict; use warnings; my @array=qw(a b c d e); my $num = 13; sub jw { my $average = int($num/@array); my %result = map{$_=>$average} @array; for my $i (1..($num - $average*@array)){ ++$result{$array[$i-1]}; } %result } sub ike1 { my %result; my $n=$num; $result{$array[$n%@array]}++ while ($n--); %result } sub ike1b { my %result; $result{$array[$_%@array]}++ for (1..$num); %result } sub ike3 { my $i; map{$array[$i++],length}('1'x$num)=~/^@{['(.*)'.'(\1.?)'x$#array]}$/ } sub zaxo { my %result; @result{@array} = map { int($num/@array) + ($_ < $num % @array) } 0 .. $#array; %result } sub davido { my %result; my @a=@array; my $n=$num; $result{do{my$v=shift@a;push@a,$v;$v}}++while$n--; %result } sub ted { my %result; my $n=0; $result{$array[$n++]} = int($num / ($#array + 1)) + ($num % ($#array + 1) > $n) while ($n <= $#array); %result } sub pela { my %result; foreach (1..$num) { $result{$array[int(rand(scalar(@array)))]}++; } $result{$_} ||= 0 foreach (@array); %result } use Benchmark (); Benchmark::cmpthese(0, { jw => \&jw, ike1 => \&ike1, ike3 => \&ike3, ike1b => \&ike1b, zaxo => \&zaxo, davido => \&davido, ted => \&ted, pela => \&pela, }); __END__