![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_12.png?5a7ff87)
以前、データのランダムな並べ替えについて質問したことがあり(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使いの方でなくても構いません^^;
No.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
回答ありがとうございます。
perlのドキュメントにも書いてあったのですね。同じ項に載っていたspliceを使った例なども、とても参考になりました。これらの方法を参考に、どんな風に書くと高速化できるのかなど検証してみたいと思います。
また、Q.944003のNo.2で示されたソートを使った方法というのが気になっており、そのアルゴリズムやコードに関する情報をもう少し待ってみたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列やハッシュで中身が同じか...
-
index関数で複数個抜き出す
-
[Perl]長すぎるif文を簡単にしたい
-
組み合わせを作るアルゴリズム
-
正規表現に関する質問
-
perlで2つの配列を比較する方...
-
データのシャッフルについて
-
QNo.3258883データベースから取...
-
VBAでの一時停止と再開の方法
-
VBのReturnの使い方
-
UWSCの終了の仕方
-
DoEventsが必要な理由について
-
テキストボックスの名前に変数...
-
画面を強制的に再描画させる方法
-
二次元配列のインデックスについて
-
vb.netからエクセル関数書き込み
-
ハッシュのハッシュを実現したい。
-
マクロ Publicでの配列定義
-
GIFアニメをループさせたくない
-
Javaの質問です。 この問題の答...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データベースから取得したデー...
-
perlで2つの配列を比較する方...
-
perlでファイルの拡張子を除い...
-
python質問
-
QNo.3258883データベースから取...
-
組み合わせを作るアルゴリズム
-
非共通要素を抜き出す
-
アルファベットn文字の組み合わ...
-
grep関数を用いた複数行からの抽出
-
複数の配列の要素を繰り返し処...
-
桁数指定と四捨五入
-
ハッシュのハッシュの値代入で...
-
サブルーチンへ渡した配列のリ...
-
index関数で複数個抜き出す
-
二次元配列のつかいかた。
-
正規表現 perl 連続ヒットの...
-
配列に入った変数を二度使いたい
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
VBのReturnの使い方
おすすめ情報