配列をシャッフルする
2007.8.16
基本的なアルゴリズムですが、静的クラスで配列シャッフル関数を作ったのでご紹介。
ちなみにActionScript2.0用のコードですが、package宣言や型指定をすれば下記コードもActionScript3.0で使用できます。
コード
class ExArray { static public function shuffle(arr:Array){ var l = arr.length; var newArr = arr; while(l){ var m = Math.floor(Math.random()*l); var n = newArr[--l]; newArr[l] = newArr[m]; newArr[m] = n; } return newArr; } }
使用方法
- 上記ソースコードをテキストエディタにコピペし、「ExArray.as」という名前で保存します。
- 実行したいflaファイルと同階層、またはクラスパスを通したディレクトリにこのファイルを設置します。
- 下記のようなコードをflaファイル上で記述するとシャッフルが実行されます。
var a:Array = new Array(); a = [1,2,3,4,5,6,7,8]; var aa = ExArray.shuffle(a); trace(aa); //出力例: 5,6,3,4,7,8,1,2
実行方法はすごく単純です。ExArray.shuffle(対象の配列);と実行すれば、シャッフルされた配列が戻ってくるという仕組みです。
ここで使われている静的クラス(static)は、ActionScriptのビルトインクラス、Mathクラスのように、var m:Math = new Math();とコンストラクタでいちいちインスタンスを作らなくてもOKなのです。staticで宣言しておけばそのメソッドをさくっと利用できるため、軽いアルゴリズムの利用なんかにおすすめです。もちろんそれ以外でも活用できますが。
ちなみにArrayクラスをextendsキーワードで継承したクラスを作れば、コンストラクタでインスタンスを作成し、それを.shuffle()するといったことができます。
また、prototype拡張や、ASSetPropFlagsなどでArrayクラス自体を拡張することができますが、こちらはおすすめできません。なぜならこちらはArrayを拡張するので、Array.shuffle();といったことが可能になるわけですが、こうしてしまうと独自にユーザーが拡張しているということが傍目で分かりづらく、コードの部分部分からでは非常に読みにくくなっています。そのためコードの再利用性が落ち、他人も読みにくくなってしまいます。Arrayなど、ビルトインクラスを拡張するのはあまりおすすめできません。