перетасовка двумерного массива в Perl - PullRequest
2 голосов
/ 31 января 2012

У меня есть файл данных, например, двумерный массив

22950   12
80044   22
02942   06
42018   20
63829   10
...

Я хочу перетасовать этот массив в случайный порядок, например

42018   20
22950   12
...

Похоже на 'shuffle'в List может быть использован, чтобы перетасовать вектор, как сохранить обработку этого вида двумерного массива?

Ответы [ 3 ]

6 голосов
/ 31 января 2012

Поскольку вы перетасовываете только первое измерение массива, List::Util::shuffle будет работать без каких-либо изменений.

Perl не имеет многомерных массивов, он имеет массивы скаляров, каждый из которых также может быть массивом. По сути, это многомерный массив, но это означает, что вы можете использовать обычные операции над массивами, такие как shuffle, поскольку shuffle не волнует, какие значения у массива (и в этом случае они будут другими массивами).

поэтому строка:

my @random = shuffle \@array1, \@array2, \@array3;

совпадает с

my @random = shuffle 1, 2, 3;

, что касается shuffle (список из 3 элементов для перемешивания).

при условии, что ваши 2D-данные содержатся в массиве @data

my @data = (
    [1234, 34],
    [4564, 45],
    ...
);

тогда вы просто напишите:

use List::Util 'shuffle';
my @random = shuffle @data;

и тогда вы получите обычный доступ к 2D-структуре:

say $random[0][1];
2 голосов
/ 31 января 2012

Эрик прав, что вы можете перетасовывать многомерные массивы, как если бы они были скалярами. Однако, если у вас есть файл, такой как в вашем примере, вы можете просто сделать:

perl -MList::Util=shuffle -lwe 'print shuffle <>' input.txt > output.txt
0 голосов
/ 31 января 2012

Я буду использовать что-то без модуля, например:

use strict;
use warnings;

my @liste = (['22950','12'],
['80044','22'],['02942','06'],['42018','20'],['63829','10']);

print $_->[0], ' ',$_->[1], "\n" foreach ( @liste);

foreach (1 .. 10) {
  fisher_yates_shuffle( \@liste );
  print "=======\n";
  print $_->[0], ' ',$_->[1], "\n" foreach ( @liste);
}

sub fisher_yates_shuffle {
    my $deck = shift;  # $deck is a reference to an array
    my $i = @$deck;
    while (--$i) {
        my $j = int rand ($i+1);
        @$deck[$i,$j] = @$deck[$j,$i];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...