This is the standard "pack of cards" algorithm that I mentioned in
Re: Random data generation., misunderstanding
BrowserUk's question. Changing the code for your case would give:
use strict;
use warnings;
my $nRepeats = 1;
my @sSet = (4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
my $nLength = 8;
my @sAll;
for (1..$nRepeats) {
push (@sAll, @sSet);
}
if ($nLength - 1 > $#sAll) {die "Don't be silly"}
my $sString;
for (1..$nLength) {
my $i = int(rand(@sAll));
$sString .= $sAll[$i];
$sAll[$i] = $sAll[-1];
pop(@sAll);
}
print "$sString \n";
I haven't tested this variation, but I tested the original.
Regards,
John Davies