Perlで2つの配列をまったく同じ方法でシャッフルするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1297224

  •  18-09-2019
  •  | 
  •  

質問

Perlでまったく同じ方法で2つの配列をランダムにシャッフルする方法を知っている人はいますか?たとえば、これらの2つの配列があるとします。

シャッフル前:配列1:1、2、3、4、5配列2:A、B、C、D、E

シャッフル後:配列1:2、4、5、3、1配列2:b、d、e、c、a

したがって、各配列内のすべての要素は、その等価要素に結合します。

役に立ちましたか?

解決

これを試してみてくださいこれ:

use List::Util qw(shuffle);
my @list1 = qw(a b c d e);
my @list2 = qw(f g h i j);
my @order = shuffle 0..$#list1;
print @list1[@order];
print @list2[@order];

他のヒント

最初:パラレル配列 それは 悪いコードの潜在的な兆候。オブジェクトの配列またはハッシュを使用して、そのトラブルを保存できるかどうかを確認する必要があります。

それにもかかわらず:

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 インデックスのリストをランダムな順序で作成し、同じインデックスのリストですべての配列をスライスします。

使用する リスト:: util 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 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

これにより、直接反復することができます @shuffled_pairs インデックス用の追加配列を保持し、Cスタイルループを回避する必要なく。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top