// forked from nemu90kWw's 1行でArrayをシャッフルする // オリジナルでは0のところは-1と1どっちかと同じ扱いにされて偏るんじゃないかと思ったので package { import flash.display.*; import flash.text.*; public class Shuffle extends Sprite { private var textfield:TextField; function Shuffle() { var i:int, array:Array, text:String = ""; text += "Array.sort(function():int{return Math.random() > 0.5 ? 1 : -1;});\nで、もっとランダムに配列をシャッフルできる。\n"; text += "◆シャッフルのテスト\n"; array = new Array(); for(i = 1; i <= 16; i++) {array.push(i);} text += "array = ["+array+"]\n\n"; text += shuffle(array)+"\n"; text += shuffle(array)+"\n"; text += shuffle(array)+"\n"; text += shuffle(array)+"\n"; text += shuffle(array)+"\n"; text += "\n◆分布のテスト\n"; array = new Array(); for(i = 1; i <= 3; i++) {array.push(i);} // text += "array = ["+array+"]\n\n"; var result:Object = {"1,2,3":0,"1,3,2":0,"2,1,3":0,"2,3,1":0,"3,1,2":0,"3,2,1":0}; var N : int = 100000; for(i = 0; i < N; i++) {result[shuffle(array)]++;} var xi2 : Number = 0.0; for(var str:String in result) { text += "["+str+"] = "+result[str]+"\n"; xi2 += (result[str] - N/6) * (result[str] - N/6) / (N/6); } text += "χ^2=" + xi2 + "\n"; text += "\n◆オリジナル分布のテスト\n"; result = {"1,2,3":0,"1,3,2":0,"2,1,3":0,"2,3,1":0,"3,1,2":0,"3,2,1":0}; for(i = 0; i < N; i++) {result[shuffle_original(array)]++;} xi2 = 0.0; for(str in result) { text += "["+str+"] = "+result[str]+"\n"; xi2 += (result[str] - N/6) * (result[str] - N/6) / (N/6); } text += "χ^2=" + xi2 + "\n"; textfield = new TextField(); textfield.x = textfield.y = 0; textfield.width = textfield.height = 465; textfield.text = text; addChild(textfield); } public function shuffle_original(array:Array):Array { return array.sort(function():int{return int(Math.random() * 3) - 1;}); } public function shuffle(array:Array):Array { return array.sort(function():int{return Math.random() > 0.5 ? 1 : -1;}); } } } forked from: 1行でArrayをシャッフルする