以前、データのランダムな並べ替えについて質問したことがあり(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ランキング
-
組み合わせを作るアルゴリズム
-
データベースから取得したデー...
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
VBのReturnの使い方
-
DoEventsが必要な理由について
-
クラスに配列を渡す方法
-
pythonでファイルのコメント行...
-
DOSコマンドのループ内のTIMEコ...
-
For文を使った九九表の作成
-
VBAで3秒だけ時間を止めたい
-
英語でのシャープとコメの呼び...
-
vbscriptでIE自動入力(途中で...
-
ループ内での条件処理
-
CSVファイルの特定の行だけを読...
-
GIFアニメをループさせたくない
-
VBA横データを縦にしたいです
-
vb.netからエクセル関数書き込み
-
VBScript 配列
-
エクセル関数で1〜12の数字がル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データベースから取得したデー...
-
perlで2つの配列を比較する方...
-
DBIを使ってのデータの取り出し...
-
python質問
-
perlでファイルの拡張子を除い...
-
アルファベットn文字の組み合わ...
-
grep関数を用いた複数行からの抽出
-
乱数と順列と組み合わせ
-
半角文字の縦書き表示
-
配列やハッシュで中身が同じか...
-
ループ中でのmy宣言と処理速度
-
桁数指定と四捨五入
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
VBのReturnの使い方
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
おすすめ情報