У меня есть матрица, которую я хочу рандомизировать несколько тысяч раз, сохраняя при этом итоговые значения строк и столбцов:
1 2 3
A 0 0 1
B 1 1 0
C 1 0 0
Примером допустимой случайной матрицы будет:
1 2 3
A 1 0 0
B 1 1 0
C 0 0 1
Моя фактическая матрица намного больше (около 600x600 элементов), поэтому мне действительно нужен подход, который является эффективным с точки зрения вычислений.
Мой первоначальный (неэффективный) подход состоял из перетасовки массивов с помощью Perl Cookbook shuffle
Я вставил свой текущий код ниже. У меня есть дополнительный код, чтобы начать с нового перетасованного списка чисел, если в цикле while не найдено никакого решения. Алгоритм отлично работает для небольшой матрицы, но как только я начинаю масштабироваться, навсегда требуется найти случайную матрицу, соответствующую требованиям.
Есть ли более эффективный способ выполнить то, что я ищу? Большое спасибо!
#!/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;
}