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

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

ActionScript3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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にアクセスすると配列が格納されます。

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

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