如何在Perl中以完全相同的方式洗牌两个数组?

如何在Perl中以完全相同的方式洗牌两个数组?,perl,arrays,shuffle,Perl,Arrays,Shuffle,有人知道如何用Perl中完全相同的方式随机洗牌两个数组吗? 例如,假设我有两个数组: 洗牌前: 数组1:1,2,3,4,5 数组2:a、b、c、d、e 洗牌后: 数组1:2,4,5,3,1 数组2:b,d,e,c,a 因此,每个数组中的每个元素都绑定到其等效元素。使用shuffle将索引列表无序排列,并将结果映射到数组上 use strict; use warnings; use List::Util qw(shuffle); my @array1 = qw( a b c d e ); my

有人知道如何用Perl中完全相同的方式随机洗牌两个数组吗? 例如,假设我有两个数组:

洗牌前: 数组1:1,2,3,4,5 数组2:a、b、c、d、e

洗牌后: 数组1:2,4,5,3,1 数组2:b,d,e,c,a

因此,每个数组中的每个元素都绑定到其等效元素。

使用
shuffle
将索引列表无序排列,并将结果映射到数组上

use strict;
use warnings;

use List::Util qw(shuffle);

my @array1 = qw( a b c d e );
my @array2 = 1..5;

my @indexes = shuffle 0..$#array1;
my @shuffle1 = map $array1[$_], @indexes;
my @shuffle2 = map $array2[$_], @indexes;

更新 使用Chris Jester Young的解决方案。是我应该想到的一个更好的选择。

试试(类似的)以下方法:

第一:并行数组是坏代码的潜在标志;您应该看看是否可以使用一个对象数组或散列来避免麻烦

尽管如此:

use List::Util qw(shuffle);

sub shuffle_together {
  my (@arrays) = @_;

  my $length = @{ $arrays[0] };

  for my $array (@arrays) {
    die "Arrays weren't all the same length" if @$array != $length;
  }

  my @shuffle_order = shuffle (0 .. $length - 1);

  return map {
    [ @{$_}[@shuffle_order] ]
  } @arrays;
}

my ($numbers, $letters) = shuffle_together [1,2,3,4,5], ['a','b','c','d','e'];
基本上,使用shuffle以随机顺序生成索引列表,然后使用相同的索引列表对所有数组进行切片。

还有另一种方法:

use strict;
use warnings;

use List::AllUtils qw(pairwise shuffle);

my @list1 = qw(a b c d e);
my @list2 = qw(f g h i j);

my @shuffled_pairs = shuffle pairwise{[$a, $b]} @list1, @list2;

for my $pair ( @shuffled_pairs ) {
    print "$pair->[0]\t$pair->[1]\n";
}
输出:

C:\Temp> sfl e j b g d i a f c h C:\Temp>sfl e j 乙二醇 d i f 碳氢化合物
这样,您就可以直接在
@shuffled_对上进行迭代,而无需为索引保留额外的数组并避免C样式的循环。

您不需要使用
映射;数组可以由另一个数组编制索引,该数组包含要获取的索引。:-+用于列表切片的使用。我不记得我应该经常使用它们。@daodoad:我非常喜欢散列切片:@foobar{qw(foobar baz qux)}:-)@Brad Gilbert:我知道你认为将
qw(a b c d e)
转换成
qw'a b c d e'
可以改善高亮显示,这是非常主观的,但请记住
更难看到(
和大多数Perl代码都使用
qw()
qw/
。我不确定易读性的损失是否值得颜色的改进。我想添加一个:#可选…@list1=@list1[@order];@list2=@list2[@order];@Sinan:同意,而“回滚”链接正盯着我,很诱人。:-)(顺便说一句,我也喜欢你的方法,我喜欢它;但是我太喜欢列表/散列切片了,所以不能不使用这种方法。:-P)+1指出你不应该有并行数组,而应该有其他东西的数组(数组、散列、对象等等)来物理上保持数据在一起。@Tanktalus:“不应该”太强烈了。这是代码味道,但有时候就是这样。 C:\Temp> sfl e j b g d i a f c h