2011年の抱負を語ってから連続でAS3の話で恐縮ですが、、、毎度困ってる重複しないランダムのClassをメモします。

重複しないランダムは何かと便利です。その数を引っ張り出すのに、毎回関数で数字を生成するのはナンセンス。なので、一回のメソッドでほしい数分が格納された配列を作る。そんなClassを作りました。

package {
	public class RandomNonOverlapping {
		//↓この配列に重複しないランダムの数字が入ります。
		public var ary= new Array();
		public var max:uint = new uint();
		public var Need:uint = new uint();//必要な個数
		public function RandomNonOverlapping(m,n) {
			init(m,n);
		}
		public function init(m,n):Array {
			var max:uint = m;
			var Need:uint = n;
			var int_a = new Array();
			var int_b = new Array();
			//0~maxの数字を全部配列に入れる
			for (var i:int=0; i<= max; i++) {
				int_a[i] = i;<br />
			}
			var j:Number = 0;
			var a_length:Number = int_a.length;
			//要は配列をシャッフルする
			while (a_length) {
				var int_r:Number = Math.floor(Math.random()*(max+1-j));
				//乱発生した整数を配列int_bに順番に入れ、int_aから削除する
				int_b[j] = int_a.splice(int_r, 1);
				j++;
				//配列int_a内の数字が一つずつ減っていく
				a_length = int_a.length;
			}
			//ここで配列int_bがシャッフルされた
			//int_bの頭から必要な分を取り出す
			for (var k:int = 0; k <Need; k++) {
				ary[k] = int_b[k];
			}
			//配列を返す
			return ary;
		}
	}
}

このClassをnewしてaryにアクセスすると配列が格納されます。

var randomAry = new RandomNonOverlapping(9,10).ary;
trace(randomAry);

第一引数には生成する乱数の最大数を、第二引数には配列の長さ、乱数の数をつけます。数が一致しないのは「0」も1つとカウントするからです。この例では「0,1,2,3,4,5,6,7,8,9」の数字がランダムに格納されることになります。

AS3で重複しないランダムな数字を配列で返す方法
Pocket

Tagged on:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です