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,実行される");})();
//の違いの気持ち悪さよ。