It it a requirement of the Fisher-Yates shuffle that the "randomizing
window" grow smaller through each iteration? Why not just do:

sub shuffle {
  my $deck = shift;
  my $size = @$deck;
  my ($j, $t);
  for (@$deck) {
    $t = $deck->[$j = int rand $size];
    $deck->[$j] = $_;
    $_ = $t;
  }
}

This is considerably faster than both versions in my tests, and sidesteps
most nasty boundary cases.

Reply via email to