From: Hideo Konami Date: 2005-07-02T16:45:30+09:00 Subject: [ruby-list:40910] Re: 配列をシャッフル 小波です。みなさん,どうもありがとうございます。 考えてみると,私の当初の意図は非復元無作為抽出で,それをshuffle という名 前のメソッドにしたところが,ちょっと誤解のもとだったようです。 非復元抽出の方は,要素を一個ランダムに抜き取っては,「母集団」の配列から その要素を消し去っていくというアイディア(小波原案,なかださん改訂)が まあ基本でしょう。 たけ(tk)さんの sort_by(rand) はそうでなくていきなりのランダマイズで,そ の短さにびっくり。知らなかったのですが 1.8.0 からの追加機能なんですね。 一方,シャッフルというのは,カードをランダムな分け目で分割してから,後半 を前半の前に置いてやるのがよく知られた手順です。この方向で考えてくださっ た人がいたので,かえって面白くなりました。(時田さん,永井さん,なかださん) このようなシャッフルでは,カードの並びの構造を,もし最後のカードの下に トップのカードがあるという環状の構造とみなすと,いくらやっても順序は 変更されないということになります。じっさい,途中で順序の反転を入れてない ものでは,ぐるぐる回りが発生します。 実際のシャッフルは,もう少し乱れの要素が入っていて,カードの塊の抜き取り を,下のほうではなくて,中ほどからおこなっているようです。このことによっ て幾分かのランダマイズが行われます。それをしつこくやることで十分な,ある いは「ほどよい」ランダマイズを達成しているわけです。実際にカードゲームを シミュレートしようとすると,こういう処理でリアリティを出すことになるかも 知れません。 安達さんのも,ランダムなスワップを繰り返すという部分的なランダマイズが基 本ですから,どの程度の回数繰り返せば十分なランダマイズになるのかに 興味を持って,統計的検定などを試みたのです。要素の数程度のスワップを 繰り返せば完璧にランダマイズされることがわかったのは,ちょっとした驚 きでした。 そんなわけで,私はガキのごとくに単純な好奇心野郎なので,ご不快を感じさせ たとしたらごめんなさい>安達さん と,なんだかえらそうに書いているように思われそうですが,みなさんのソース はぜんぶ読ませていただいて,実行してみました。これはとても勉強になりまし た。ありがとうございます。