我有一个像二维数组
的数据文件22950 12
80044 22
02942 06
42018 20
63829 10
...
我想将这个数组随机排列,比如
42018 20
22950 12
...
看起来像是' shuffle'在List中可以用来随机播放一个向量,如何处理这种二维数组呢?
答案 0 :(得分:6)
由于您只是改组数组的第一维,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];
答案 1 :(得分:2)
Eric是正确的,你可以将多维数组洗牌,就好像它们是标量一样。但是,如果您的示例中包含文件,则可以执行以下操作:
perl -MList::Util=shuffle -lwe 'print shuffle <>' input.txt > output.txt
答案 2 :(得分:0)
我会使用没有模块的东西,比如:
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];
}
}