memo:javascriptで配列をランダムに入れ替える
かっとなった。仕組み自体はどこでも使える。
//並べ替える関数 //戻り値:並べ替えられた配列 function randArry(ar,len,r){ if(len > 0){ var id_ = parseInt(Math.random()*len); ret = removeArry(ar,id_); r.push(ret["get"]); //recursivecall randArry(ret["ary"],len - 1,r); } else return r; } //配列を指定インデックスをremoveする。 //戻り値:{"get":とったモノ,"ary":removeされた配列}; function removeArry(ar,id){ var r = []; for(i = 0;i < id;i++) r.push(ar[i]); for(i = id + 1;i < ar.length;i++) r.push(ar[i]); return {"get":ar[id],"ary":r}; } //並び替えて出力1 var r = [] var m = [10,11,12,13,14]; randArry(m,m.length,r); for(i=0;i<r.length;i++) document.write(r[i] + "<br/>"); //並び替えて出力2(キモ目に書いてみた。) //対象配列[0,1,2,3,4,5,6...]というのを作成 var a = function(){ var e = []; for(i=0;i<10;i++) e.push(i); return e; }; (function(){ var r = function (ara){ var ret = [] randArry(ara,ara.length,ret);//ここで並び替えてる return ret; }(a());//aの評価はここまで遅延している、ということ? for(i = 0;i < r.length;i++) document.write(r[i] + "<br/>"); }()); //どうでもいいけど var a1 = function(){ var e = []; for(i=0;i<10;i++) e.push(i); return e; }; //と var a2 = function(){ var e = []; for(i=0;i<10;i++) e.push(i); return e; }(); //のちがいの気持ち悪さよ。 alert("a1:" + typeof(a1) + "\n" + "a2:" + typeof(a2) ); //あとは //function(){alert("シンタックスえらー");}; (function(){alert("実行されない");}); (function(){alert("これは実行される");}()); (function(){alert("シンタックスOK,実行される");})(); //の違いの気持ち悪さよ。