AS3:ランダムな配列を生成する。
例えば10枚のイメージがあって、それを10個のオブジェクトにばらばらに貼っつけたい場合、(リロード/タイマーがかかる度にオブジェクトのイメージをシャッフルさせたいということ)どうすればいいのかね?という問題。フツーに0~10からランダムに整数を取得して、それを10回繰り返すと同じイメージが2つ以上現れてしまう可能性が大です。絶対にイメージがかぶらないようにするにはどーすればよいのか?という問題。
どう検索すればよいのかわからずごにょごにょしましたが、「配列をランダムに生成する」、「Fisher-Yates」という方法があることを知りました。
スクリプトはこんな感じ。ここでは仮に配列の数を10コにしています。
var list:Array=[0,1,2,3,4,5,6,7,8,9];
var i:int=list.length;
while(i--){
var j:int=Math.floor(Math.random()*i);
var t:Number = list[i];
list[i] = list[j];
list[j] = t;
}
かなり行数が少ないキレイなスクリプトですが、何をやってるのかイマイチわからず。
list[i]の値、list[j]の値、iの値、jの値、listをトレースするとこんなかんじになりました。
i=9
j=8
list[i]=8
list[j]=9
list=0,1,2,3,4,5,6,7,9,8
i=8
j=3
list[i]=3
list[j]=9
list=0,1,2,9,4,5,6,7,3,8
i=7
j=5
list[i]=5
list[j]=7
list=0,1,2,9,4,7,6,5,3,8
i=6
j=0
list[i]=0
list[j]=6
list=6,1,2,9,4,7,0,5,3,8
i=5
j=1
list[i]=1
list[j]=7
list=6,7,2,9,4,1,0,5,3,8
i=4
j=0
list[i]=6
list[j]=4
list=4,7,2,9,6,1,0,5,3,8
i=3
j=0
list[i]=4
list[j]=9
list=9,7,2,4,6,1,0,5,3,8
i=2
j=1
list[i]=7
list[j]=2
list=9,2,7,4,6,1,0,5,3,8
i=1
j=0
list[i]=9
list[j]=2
list=2,9,7,4,6,1,0,5,3,8
i=0
j=0
list[i]=2
list[j]=2
list=2,9,7,4,6,1,0,5,3,8
おおー。処理をする度に数字が入れ替わっているのがわかります。
つまり、
while(i--){ //配列の長さ(この場合は10)から(ゼロになるまで)1を引く。
var j:int=Math.floor(Math.random()*i); //「j」は0~(i-1)までの数字のどれか
var t:Number = list[i]; //「t」は配列のi番目の数字
list[i] = list[j]; //リストのi番目にj番目の数字を代入
list[j] = t; //リストのj番目にt(=i)を代入
}
という処理を繰り返しているのですね。
いろいろ詳しく載っているページも沢山ありますが、イマイチ原理が理解できなかったのでメモメモしました。
2010年2月 8日 11:17 | コメント(0) | トラックバック(0)|
Tweet watcher
流れゆくTwitterのつぶやきを眺めるためのブログパーツ、Tweet watcherを作りました。
下のウィンドウにツイッターIDを記入して、ボタンをクリックでコードがコピーされます。
- Search
-
- Calendar
- Clock blog parts
- Tweet Watcher
- Categories
- Recent Entries
- Archives
- Comments
-
- TrackBacks
-