とあるエンジニアの闇歴史帳

コピペで使える便利Wiki ※現在構築中です。

ユーザ用ツール


perl:array_shuffle

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

perl:array_shuffle [2017/12/14 20:18]
perl:array_shuffle [2020/06/23 14:10] (現在)
行 1: 行 1:
 +====== 配列をシャッフルしたい(ランダムな順列) - Perl ======
 +~~socialite~~
 +<note important>この記事は2006年10月13日に書かれたものです。</note>
 +
 +配列(リスト)を順不同に並べ替えたい。
 +トランプで言う「シャッフル」、アルゴリズム的な用語を使うと「ランダムな順列」に該当する。
 +
 +次のようなプログラムを記述すれば良い。
 +
 +===== サンプル =====
 +<code perl>
 +;#
 +;#配列をシャッフルする
 +;#
 +
 +#-- シャッフルする値を準備 --#
 +@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];
 +
 + }
 +}
 +</code>
 +
 +===== 実行結果 =====
 +<code>
 +3
 +5
 +2
 +1
 +4
 +0
 +</code>
 +
 +やり方は非常にシンプルだ。
 +配列を最後から最初にもどるように見て行く。その際に適当に選んだ要素とスワップ(入れ替え)をしていくという寸法である。このアルゴリズムは「Fisher-Yatesシャッフル」と呼ばれ、広く使用されている。
 +
 +shuffleArray関数では、渡された配列(のリファレンス)を直接参照して書き換える点に注意されたい。
 +
 +
 +参照:[[http://www.amazon.co.jp/exec/obidos/ASIN/4873112028/ichikorocom-22/ref=nosim/|Perlクックブック〈VOLUME1〉]]
 +
 +===== 関連書籍 =====
 +{{amazon>jp:4873113148}}
 +<html><p style="clear:both"></p></html>
 +
 +{{amazon>jp:4798139815}}
 +<html><p style="clear:both"></p></html>
 +
 +{{tag>CGI・Perl例文集 Perl 配列 リスト シャッフル ランダムな順列}}
 +~~socialite~~
  

関連ページ