use List::Util qw/ shuffle max /; my %animals = ( alligator => 100, bear => 90, cat => 80, jellyfish => 10 ); my @popular_list = shuffle map { ( $_ ) x $animals{ $_ } } keys %animals; my $popular_pick = $popular_list[ rand @popular_list ]; my @impartial_list = shuffle keys %animals; my $impartial_pick = $impartial_list[ rand @impartial_list ]; my $max_val = 1 + max values %animals; my @unpopular_list = shuffle map { ( $_ ) x ( $max_val - $animals{ $_ } ) } keys %animals; my $unpopular_pick = $unpopular_list[ rand @unpopular_list ];