代码:
use strict;
use warnings;
use Data::Dumper;
use List::Util qw(shuffle);
my @range = (1..16);
@range = shuffle(@range);
# lets make a cool grid
my $count = 0;
my $row = 1;
my $grid = {};
my @tmp;
my $c = @range;
print "Found: $c entries.nn";
foreach my $num ( @range ) {
if ( $count == 4 ) {
$grid->{$row} = [@tmp];
$row++;
$count = 0;
undef @tmp;
next;
}
$count++;
push @tmp, $num;
print "ROW $row, COUNT: $countn";
}
print Dumper $grid;
输出:
Found: 16 entries.
ROW 1, COUNT: 1
ROW 1, COUNT: 2
ROW 1, COUNT: 3
ROW 1, COUNT: 4
ROW 2, COUNT: 1
ROW 2, COUNT: 2
ROW 2, COUNT: 3
ROW 2, COUNT: 4
ROW 3, COUNT: 1
ROW 3, COUNT: 2
ROW 3, COUNT: 3
ROW 3, COUNT: 4
ROW 4, COUNT: 1
$VAR1 = {
'1' => [
9,
12,
4,
2
],
'3' => [
14,
3,
1,
6
],
'2' => [
15,
7,
16,
5
]
};
我正在寻找一个4乘4矩阵
只需几项更改,您就可以获得:
use strict;
use warnings;
use Data::Dumper;
use List::Util qw(shuffle);
my @range = (1..16);
@range = shuffle(@range);
# lets make a cool grid
my $count = 0;
my $row = 0; # start this at 0 instead of 1
my $grid = []; # make this an array instead of a hash
my @tmp;
my $c = @range;
print "Found: $c entries.nn";
foreach my $num ( @range ) {
$count++;
push @tmp, $num;
print "ROW $row, COUNT: $countn";
if ( $count == 4 ) { # move this to the end of the loop
$grid->[$row] = [@tmp];
$row++;
$count = 0;
undef @tmp;
}
}
print Dumper $grid;
部分输出:
$VAR1 = [
[
8,
3,
12,
4
],
[
1,
10,
14,
15
],
[
6,
16,
2,
5
],
[
7,
13,
11,
9
]
];
使用splice
:可以简单一点
use strict;
use warnings;
use List::Util qw(shuffle);
my @array = shuffle(1..16);
my @AofA;
while (@array) {
push @AofA, [splice @array, 0, 4];
}
use Data::Dump;
dd @AofA;
输出:
[[5, 13, 8, 4], [15, 9, 6, 3], [12, 7, 16, 14], [10, 1, 11, 2]]
如果我理解你想要什么,这应该可以做到:
my @range = (1..16);
# lets make a cool grid
my $grid = {};
for (my $i = 1; $i <= 4; $i++) {
@range = shuffle(@range);
print qq|Doing: $i n|;
$grid->{$i} = [splice(@range,0,4)]; # get the first 4 element, as we have it shuffled now
}
print Dumper $grid;
其想法是,您只需循环遍历4个值(1-4),然后对其中的每个值,shuffle
数组,最后获取数组中的前4个元素。这应该会给你从你提供的范围中随机选择4个,同时仍然很好和有效:)