# %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] }; }