Please analyze the code carefully, pull out your school books, and see if I have made a mistake.
Yes you have. You're not emulating a Fisher-Yates shuffle :-)
Consider the original code from perlfaq:
sub fisher_yates_shuffle { my $deck = shift; # $deck is a reference to an array my $i = @$deck; while ($i--) { print $i, "\n"; my $j = int rand ($i+1); @$deck[$i,$j] = @$deck[$j,$i]; } }
Note how $i is decremented on each iteration. Consider how that alters the sequence of possible indices.
Once you take that into account you get the textbook behaviour.
sub fixed_fisher_yates_shuffle { my ($deck, $rand) = @_; my $i = @$deck; while ($i--) { my $j = shift @$rand; @$deck[$i,$j] = @$deck[$j,$i]; } } use Set::CrossProduct; my $i = Set::CrossProduct->new([ [0..4], [0..3], [0..2], [0..1], [0] ] +); my %count; while (my $a = $i->get) { print "@$a : "; my @foo = (1,2,3,4,5); fixed_fisher_yates_shuffle(\@foo, $a); print "@foo\n"; $count{"@foo"}++; }; foreach my $key (sort keys %count) { print $key, " = ", $count{$key}, "\n"; };
In reply to Re: Fisher-Yates theory... does this prove that it is invalid?
by adrianh
in thread Fisher-Yates theory
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |