※ ChatGPTを利用し、要約された質問です(原文:データのシャッフルについて)
データのシャッフルについて
2004/07/30 17:53
このQ&Aのポイント
データのランダムな並べ替えについて質問し、JavaScriptの回答をPerlに移植した。公平なランダムの実装を知りたい。
質問Q.725588で参考にしたPerlのコードを紹介。@listの要素をランダムに入れ替えるshuffle関数を実装。
質問Q.944003では、No.3やNo.4のアルゴリズムになるでしょうか。ソートを使ったアルゴリズムには理解がない。
以前、データのランダムな並べ替えについて質問したことがあり(Q.725588)、その時に回答して頂いたコード(その時はJavaScriptでの質問でした)をPerlにも移植(というほど大げさなものでもありませんが・・・)して使っていました。
そんなこともありQ.944003「公平なランダム」を興味深く見ていたのですが、こちらではコードは示されずに終了してしまいました。まぁ、ここまで書いてあれば後は実装するだけなのですが、素人に毛が生えた程度の私では、よりよいコーディングなど望めません。熟練のPerl使いの方ならどのようにコーディングするのだろう、などと思い、質問を投稿する次第です。
ちなみに私がQ.725588を参考に書いたコードは、次のようなものです。
sub shuffle {
my @list = @_;
for (my $i = $#list; $i > 0; $i--) {
my $r = int(rand($i+1));
if ($r != $i) {
my $tmp = $list[$i];
$list[$i] = $list[$r];
$list[$r] = $tmp;
}
}
return @list;
}
Q.944003の中では、No.3やNo.4のアルゴリズムになるでしょうか。なお、No.2で示されたソートを使ったアルゴリズムは、私には理解できませんでした。
もっと速いコードや、よりPerlらしいコーディングなどがありましたら、ぜひ参考にしたいのでご回答をお願いいたします。
※別に熟練のPerl使いの方でなくても構いません^^;
質問の原文を閉じる
質問の原文を表示する
お礼
回答ありがとうございます。 perlのドキュメントにも書いてあったのですね。同じ項に載っていたspliceを使った例なども、とても参考になりました。これらの方法を参考に、どんな風に書くと高速化できるのかなど検証してみたいと思います。 また、Q.944003のNo.2で示されたソートを使った方法というのが気になっており、そのアルゴリズムやコードに関する情報をもう少し待ってみたいと思います。