プロが教えるわが家の防犯対策術!

以前、データのランダムな並べ替えについて質問したことがあり(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使いの方でなくても構いません^^;

A 回答 (1件)

PerlのFAQに、



「How do I shuffle an array randomly? (配列をランダムにかき混ぜるには?)」

――ってのが、あります。質問の中でかかれているのと、そんなに変わらないみたいですが。

また、Perl 5.8.0以降なら、モジュールList::Utilにshuffleという関数が定義されてます。こっちはXSですので、処理速度の面で有利です。

参考URL:http://perldoc.jp/docs/perl/5.6.1/perlfaq4.pod
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
perlのドキュメントにも書いてあったのですね。同じ項に載っていたspliceを使った例なども、とても参考になりました。これらの方法を参考に、どんな風に書くと高速化できるのかなど検証してみたいと思います。
また、Q.944003のNo.2で示されたソートを使った方法というのが気になっており、そのアルゴリズムやコードに関する情報をもう少し待ってみたいと思います。

お礼日時:2004/08/02 17:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!