sub biased_die_roll { my %dist = (1=>0.01,2=>0.01,3=>0.01,4=>0.01,5=>0.48,6=>0.48); my ($key, $weight); my $rand = rand; while ( ($key, $weight) = each %dist ) { return $key if ($rand -= $weight) < 0; } }