my @population = (1..10); # destructive source my $n = 3; # desired selection size my @selection; # result appears here while (@selection < $n) { my $swapper = int rand @population; push @selection, $population[$swapper]; if ($swapper < $#population) { $population[$swapper] = $population[-1]; } pop @population; }