« 変数がらみのパス[flash編] | メイン | ここ最近の出来事 »

2007年09月06日

●X個の値を乱数で重複しないで発生

Flashクイズなどでランダムに出題し、尚かつ問題が重複しないように乱数の発生を配列を使って管理する。
いろんなサイトを見て参考にして、自分なりに記述。


これで重複しないで乱数を発生させることが出来る。


//値総数宣言
var Dtotal = X;
//問題発生回数リセット
Dnum=0;
//問題番号格納用の並列作成
var Qbox = new Array();

//問題設定ファンクション
function xQuestion(){
   //問題数<値総数が第一条件
   if(Dnum < Dtotal){
    //Y問目カウント
    Dnum++;
    if(Dnum==1){
     //値総数を乱数発生、一回目は素直に加
    Qnum = Math.floor(Math.random() * Dtotal);
     //発生した乱数を配列に格納
     Qbox.push(Qnum);
    }else{
     Qnum = Math.floor(Math.random() * Dtotal);
    //重複チェック用に現在の配列の要素数を求める
    var Qlen = Qbox.length;
    //重複チェック
    loop_flg=0;
    while(loop_flg != 1){
     //重複ループを抜けるフラグを先に立て、チェックに引っかかったらフラグ変数を変えて再度ループさせる
     loop_flg=1;
      for(i =0; i<=(Qlen-1) ; i++){
       if(Qbox[i] == Qnum){
        //配列要素全てと発生させた乱数をチェックし、重複があった場合は再度乱数発生
        Qnum = Math.floor(Math.random() * Dtotal);
        loop_flg++;
       }
      }
     }
     //発生した乱数を配列に格納
     Qbox.push(Qnum);
    }
   }
}

xQuestion();を実行するたびに乱数を発生させることが出来ます。
 
※はっきりしたことは言えないが値の総数が非常に多いと処理落ちするのかなぁ・・・