« 明日(昨日)の日付を計算したい (Perl, Date::Simple) | メイン | [vi] 起動・終了 »

カテゴリー:ソート(並べ替え) リスト(配列) 

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

このエントリーを含むはてなブックマーク  livedoorクリップ  配列をシャッフルしたい (ランダムな順列)をdel.icio.usに追加  配列をシャッフルしたい (ランダムな順列)をYahoo!ブックマークに追加  配列をシャッフルしたい (ランダムな順列)をニフティクリップに追加

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

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

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

#-- シャッフルする値を準備 --#
@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関数では、渡された配列(のリファレンス)を直接参照して書き換える点に注意されたい。

参照:Perlクックブック〈VOLUME1〉




トラックバック

このエントリーのトラックバックURL:
http://katsubemakito.net/mt/mt-tb.cgi/338

この一覧は、次のエントリーを参照しています: 配列をシャッフルしたい (ランダムな順列):

» [メモ] 配列をシャッフル(ランダムソート)する from くれすのPerl日記
適当に書いたものだから精度は不明。とりあえずランダムにはなる。 @array = sort { int(rand(3)) - 1 } @array; 可... [詳しくはこちら]

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

VPSレンタルサーバー




クリエイティブ・コモンズ・ライセンス
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.