配列をシャッフルしたい(ランダムな順列) – Perl

  • このエントリーをはてなブックマークに追加
  • LINEで送る
この記事は 2006年10月13日 に書かれたものです

配列(リスト)を順不同に並べ替えたい。 トランプで言う「シャッフル」、アルゴリズム的な用語を使うと「ランダムな順列」に該当する。

次のようなプログラムを記述すれば良い。

- Sponsored Link -

サンプル

;#
;#配列をシャッフルする
;#

#-- シャッフルする値を準備 --#
@array = (0,1,2,3,4,5);

#-- シャッフル --#
shuffleArray(\@array);
print join("\n", @array);


#-----------------------------------#
#配列をシャッフル
#-----------------------------------#
sub shuffleArray{
 my $array = shift;
 my $len = scalar(@$array);

 for(my $i=$len-1 ; $i>=0; --$i){
  my $j = int( rand($i+1) );
  next if($i==$j);

  @$array[$i, $j] = @$array[$j, $i];

 }
}

実行結果

3
5
2
1
4
0

やり方は非常にシンプルだ。 配列を最後から最初にもどるように見て行く。その際に適当に選んだ要素とスワップ(入れ替え)をしていくという寸法である。このアルゴリズムは「Fisher-Yatesシャッフル」と呼ばれ、広く使用されている。

shuffleArray関数では、渡された配列(のリファレンス)を直接参照して書き換える点に注意されたい。

参考

コメント

ご感想やご質問などお気軽にどうぞ。書き込むにはfacebookへのログインが必要です。

このブログを応援する

お寄せいただいたお気持ちは全額サーバ代や次の記事を執筆するための原資として活用させていただいております。この記事が参考になった場合などぜひご検討ください。

PayPal(ペイパル)
PayPalで300円支払う
※金額は任意で変更できます。
※100円でも泣いて喜びますw
※住所の入力欄が現れた場合は「no needed」を選択ください
これまでのご協力者さま
- Sponsored Link -