use strict; use warnings; my (%h, %c); while () { chomp; @_ = split / /; $h{$_[0]} = $_[1]; } $c{weighted(\%h)}++ for 1..1000; print "$_ : $c{$_}\n" for sort {$c{$b} <=> $c{$a}} keys %c; sub weighted { my ($p, $c) = shift; $c += $_ for values %$p; $c = (int rand $c) + 1; for (keys %$p) { return $_ if ($c -= $p->{$_}) <= 0; } } __DATA__ gamma 7 beta 6 epsilon 3 alpha 2 delta 1