重複しない乱数を作り配列に入れる(AS3.0)
Flash Pro CS5
AS3.0
で記述しています。
1~10の整数をランダムかつ重複せずに配列に格納したいと考えています。
そこで,ネット上で参考になるソースを見つけ,
以下のように書き直しました。
var int_a = new Array();
var int_b = new Array();
function RandomInt():void{
//ここだけ変更すればよい
var maxN:Number = 10;//乱数の最大値
//0~maxNの数字を全部配列に入れる
for (var i:int=0; i< maxN; i++) {
int_a[i] = i+1;
}
var j:Number = 0;
var a_length:Number = int_a.length;
//要は配列をシャッフルする
while (a_length) {
var int_r:Number = Math.floor(Math.random()*(maxN+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がシャッフルされた
trace(int_b);
}
RandomInt();
としました。
しかし出力結果がなぜか
8,2,4,9,,7,6,5,10,3,1のように抜けている部分があり,
次のフレームで
for(var j:int=1; j <= 10; j++){
trace(int_b[j]);
}
として確認してもやはり
2
4
9
7
6
5
10
3
1
となってしまします。
どの部分がおかしいのか教えていただきたいです。
また,乱数発生の部分で
Math.floor(Math.random()*(maxN+1-j));
という風に記述してあったのですが,ここは間違いではないのでしょうか?
jを引いていくと発生する乱数の範囲が徐々に狭くなっていってしまうと思ったのですが;
それとも元のソースコードを使って
ttp://www.renowan.com/blog/?p=143
0~9までの乱数を発生させてそれぞれに1を足す方が簡単でしょうか?
よろしくお願いします。
お礼
ご指導ありがとうございました。 なるほど、そうすれば確率として設定できるのですね。 早速やってみたいと思います。 ありがとうございました。 >確率足して100%になってませんが… ほんとだ・・・Cを20%とするはずが、どうも焦っていたようです^^;