Hi,
update: clarification
disclaimer: bogoperm, but it does fit your description of the problem!
#!/usr/bin/perl
use strict;
use warnings;
#############
# bogoperm! #
#############
my @array = qw(a b c);
my $length = @array;
# faculty
my $fac = 1;
foreach my $f (1..$length) {
$fac *= $f;
}
# my results
my %hash = ();
# internals
my $check; # if equals control then we found a number
my $control; # has to contain something like 123...
my $index; # the number itself, it's an index!
my $count = 0; # 'till this equals $fac
OUTER: do {
INNER: while (1) {
do {
$check = 0;
$control = 0;
$index = 0;
foreach my $i (1..$length) {
my $number = 1+int(rand()*$length);
$index += $number * 10**($i-1);
$check += 10**$number;
$control += 10**$i;
}
$check /= 10; $control /= 10;
} while ($check != $control);
last INNER if defined $hash{$index};
$hash{$index}++;
$count++;
}
} while $count != $fac;
# print out the results
foreach my $i (keys %hash) {
my $j;
do {
$j = $i % 10;
print $array[$j-1];
$i = ($i - $j) / 10;
} while ($i > 0);
print "\n";
}
output:
bash-3.00$ ./perm.pl
cba
acb
bac
cab
abc
bca
I'll leave it as an exercise to put the output in real lists.
Well, at least I used strict and warnings :o
--
if ( 1 ) { $postman->ring() for (1..2); }