Aleatorizar la matriz en perl, manteniendo los totales de fila y columna iguales

Tengo una matriz que quiero aleatorizar un par de miles de veces, manteniendo los totales de fila y columna de la misma manera:

     1 2 3 
   A 0 0 1 
   B 1 1 0 
   C 1 0 0      

Un ejemplo de una matriz aleatoria válida sería:

     1 2 3
   A 1 0 0
   B 1 1 0
   C 0 0 1

Mi matriz real es mucho más grande (aproximadamente 600x600 elementos), por lo que realmente necesito un enfoque que sea computacionalmente eficiente.

Mi enfoque inicial (ineficiente) consistía en mezclar matrices usando elLibro de cocina Perl barajar

He pegado mi código actual a continuación. Tengo un código adicional para comenzar con una nueva lista de números en orden aleatorio, si no se encuentra una solución en el ciclo while. El algoritmo funciona bien para una matriz pequeña, pero tan pronto como empiezo a escalar, siempre se necesita una matriz aleatoria que se ajuste a los requisitos.

¿Hay una manera más eficiente de lograr lo que estoy buscando? ¡Muchas gracias!

#!/usr/bin/perl -w
use strict;

my %matrix = ( 'A' => {'3'  => 1 },
           'B' => {'1'  => 1,
               '2'  => 1 },
           'C' => {'1'  => 1 }
    );

my @letters = ();
my @numbers = ();

foreach my $letter (keys %matrix){
    foreach my $number (keys %{$matrix{$letter}}){
    push (@letters, $letter);
    push (@numbers, $number);
    }
}

my %random_matrix = ();

&shuffle(\@numbers);
foreach my $letter (@letters){
    while (exists($random_matrix{$letter}{$numbers[0]})){
    &shuffle (\@numbers);
    }
    my $chosen_number = shift (@numbers);
    $random_matrix{$letter}{$chosen_number} = 1;
}

sub shuffle {
    my $array = shift;
    my $i = scalar(@$array);
    my $j;
    foreach my $item (@$array )
    {
        --$i;
        $j = int rand ($i+1);
        next if $i == $j;
        @$array [$i,$j] = @$array[$j,$i];
    }
    return @$array;
}

Respuestas a la pregunta(5)

Su respuesta a la pregunta