my @cols = 0..11; randomly_derange( \@cols ); @nums = map [ @{$_}[@cols] ], @nums; sub randomly_derange { my $arr = shift(); my @i = 0..$#$arr; while ( @i ) { my @swap = map splice( @i, rand( @i ), 1 ), 1, 2; @{ $arr }[ @swap ] = @{ $arr }[ @swap[ 1, 0 ] ]; last if @i == 3; } if ( @i ) { my @j = rand() < 0.5 ? @i[ 1, 2, 0 ] : @i[ 2, 0, 1 ]; @{ $arr }[ @i ] = @{ $arr }[ @j ]; } }