my $h = { a => 0.1, b => 0.5, c => 0.4, }; for (1..10000) { $s{rand_key($h)}++; } print "output: ".join(" ", %s),"\n"; sub rand_key { my $h = shift; my $r = rand(); for (keys %$h) { $r-=$h->{$_}; return $_ if($r < 0); } return undef; } __END__ output: c 4024 a 1017 b 4959