我有這樣一個二維數組洗牌二維數組中的perl
22950 12
80044 22
02942 06
42018 20
63829 10
...
我想洗牌這個數組隨機順序,像
42018 20
22950 12
...
看起來像一個數據文件List中的'shuffle'可以用來洗牌矢量,如何保持處理這種二維數組?
我有這樣一個二維數組洗牌二維數組中的perl
22950 12
80044 22
02942 06
42018 20
63829 10
...
我想洗牌這個數組隨機順序,像
42018 20
22950 12
...
看起來像一個數據文件List中的'shuffle'可以用來洗牌矢量,如何保持處理這種二維數組?
既然你只是洗牌陣列的第一維,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];
埃裏克是正確的,你可以洗牌多維數組,就好像他們更願意e標量。但是,如果你有一個文件,如你的榜樣,你可以簡單地做:
perl -MList::Util=shuffle -lwe 'print shuffle <>' input.txt > output.txt
我會用不成才模塊,如:
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];
}
}
感謝,TLP。順便說一句,在你的答案中,我們代表什麼? – user288609 2012-01-31 03:30:41
@ user288609:'-lwe'是編寫'-l -w -e'的較短方式。這些是激活Perl中的某些行爲的標誌,這些行爲記錄在['perldoc perlrun'](http://perldoc.perl.org/perlrun.html) – Zaid 2012-01-31 05:24:44
@ user288609'-l'用於處理行尾,更具體確保在正確的地方有新行。 '-w'是警告,'-e'表示將下列文本作爲單行程序運行。 – TLP 2012-01-31 15:32:43