# ($k,$v) = rhe_1(%hash); sub rhe_1 (\%) { my $key = (keys %{ $_[0] })[rand keys %{ $_[0] }]; return ($key, delete $_[0]{$key}); } #### # @keys = keys %hash; # done ONCE # ($k,$v) = rhe_2(%hash,@keys); sub rhe_2 (\%\@) { my $key; do { $key = rand @keys } until exists $_[0]{$_[1][$key]}; return ($_[0]{$_[1][$key]}, delete $_[0]{$_[1][$key]}); } #### # %seen = (); # done ONCE # @array = ([k,v], [k,v], ...); # ($k,$v) = rhe_3(@array,%seen); sub rhe_3 (\@\%) { my $idx; do { $idx = rand @{ $_[0] } } while $_[1]{int $idx}++; return @{ $_[0][$idx] }; }