ホーム > tech > AS3:ランダムな配列を生成する。

AS3:ランダムな配列を生成する。

2010年2月 8日 11:17 | コメント(0) | トラックバック(0)|

例えば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)を代入

}

という処理を繰り返しているのですね。

いろいろ詳しく載っているページも沢山ありますが、イマイチ原理が理解できなかったのでメモメモしました。



トラックバック(0)

このブログ記事を参照しているブログ一覧: AS3:ランダムな配列を生成する。

このブログ記事に対するトラックバックURL:

コメントする

(初めてコメントする場合、承認されるまではコメントが表示されない場合があります。)