※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : uwi's forked from: 1行でArrayをシャッフルする [diff(80)]

TALK
この分布が変化するのは数学的に正しいです。
at 2009/10/06 16:42:59 by
FAVORITE BY
:
_level0のネタにさせてもらいます。ありがとうございます。
:
\(^o^)/
FORKED

forked from: forked from: 1行でArrayをシャッフルする forked from: forked from: forked from: 1行でArrayをシャッフルする [diff(18)]

  1. // forked from nemu90kWw's forked from: forked from: 1行でArrayをシャッフルする
  2. // forked from uwi's forked from: 1行でArrayをシャッフルする
  3. // forked from nemu90kWw's 1行でArrayをシャッフルする
  4. // Array.sortが元Arrayを変更することを忘れてた。
  5. // sliceでクローンを作ってからシャッフルしたら偏りが顕著に。
  6. // sortを使うのは凄く良いアイディアかと一瞬思いましたが、
  7. // このアプローチで分布を一様にすることは数学的に不可能です
  8. // なので良くアルゴリズム辞典にあるようなソートを1ライナーにしてみました。
  9. package
  10. {
  11.     import flash.display.*;
  12.     import flash.text.*;
  13.     import flash.events.*;
  14.     public class Shuffle extends Sprite
  15.     {
  16.         private var textfield:TextField = new TextField();
  17.         private var textfield2:TextField = new TextField();
  18.         private var button:Sprite = new Sprite();
  19.         private var buttontext:TextField = new TextField();
  20.         
  21.         function Shuffle()
  22.         {
  23.             textfield.x = 10;
  24.             textfield.y = 40;
  25.             textfield.width = 465/2-10;
  26.             textfield.height = 465-50;
  27.             textfield2.x = 465/2;
  28.             textfield2.y = 40;
  29.             textfield2.width = 465/2-10;
  30.             textfield2.height = 465-50;
  31.             
  32.             addChild(textfield);
  33.             addChild(textfield2);
  34.             
  35.             button.x = 10;
  36.             button.y = 10;
  37.             button.mouseChildren = false;
  38.             button.buttonMode = true;
  39.             button.graphics.lineStyle(1, 0xBBBBBB);
  40.             button.graphics.beginFill(0xEEEEEE);
  41.             button.graphics.drawRoundRect(001002055);
  42.             button.graphics.endFill();
  43.             addChild(button);
  44.             
  45.             buttontext = new TextField();
  46.             buttontext.width = 100;
  47.             buttontext.height = 20;
  48.             buttontext.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
  49.             button.addChild(buttontext);
  50.             
  51.             button.addEventListener(MouseEvent.CLICK, function(e:Event):void{test();});
  52.             test();
  53.         }
  54.         
  55.         private function test():void
  56.         {
  57.             var i:int, array:Array, text:String = "", text2:String = "";
  58.             var N : int = 10000;
  59.             
  60.             text += "return Math.random() > 0.5 ? 1 : -1;\n\n";
  61.             text += "◆シャッフルのテスト\n";
  62.             array = new Array();
  63.             for(i = 1; i <= 10; i++) {array.push(i);}
  64.             text += "array = ["+array+"]\n\n";
  65.             
  66.             text += shuffle(array)+"\n";
  67.             text += shuffle(array)+"\n";
  68.             text += shuffle(array)+"\n";
  69.             text += shuffle(array)+"\n";
  70.             text += shuffle(array)+"\n";
  71.             
  72.             text += "\n◆分布のテスト\n";
  73.             array = new Array();
  74.             for(i = 1; i <= 3; i++) {array.push(i);}
  75.             
  76.             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};
  77.             
  78.             for(i = 0; i < N; i++) {result[shuffle(array)]++;}
  79.             
  80.             var xi2 : Number = 0.0;
  81.             for(var str:String in result) {
  82.                 text += "["+str+"] = "+result[str]+"\n";
  83.                 xi2 += (result[str] - N/6) * (result[str] - N/6) / (N/6);
  84.             }
  85.             text += "χ^2=" + xi2 + "\n";
  86.             
  87.             text2 += "よくあるアルゴリズム\n\n";
  88.             text2 += "◆シャッフルのテスト\n";
  89.             array = new Array();
  90.             for(i = 1; i <= 10; i++) {array.push(i);}
  91.             text2 += "array = ["+array+"]\n\n";
  92.             
  93.             text2 += shuffle_new(array)+"\n";
  94.             text2 += shuffle_new(array)+"\n";
  95.             text2 += shuffle_new(array)+"\n";
  96.             text2 += shuffle_new(array)+"\n";
  97.             text2 += shuffle_new(array)+"\n";
  98.             
  99.             text2 += "\n◆分布のテスト\n";
  100.             array = new Array();
  101.             for(i = 1; i <= 3; i++) {array.push(i);}
  102.             
  103.             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};
  104.             
  105.             for(i = 0; i < N; i++) {result[shuffle_new(array)]++;}
  106.             
  107.             xi2 = 0.0;
  108.             for(str in result) {
  109.                 text2 += "["+str+"] = "+result[str]+"\n";
  110.                 xi2 += (result[str] - N/6) * (result[str] - N/6) / (N/6);
  111.             } 
  112.             text2 += "χ^2=" + xi2 + "\n";
  113.             
  114.             textfield.text = text;
  115.             textfield2.text = text2;
  116.             return;
  117.         }
  118.         
  119.         public function shuffle_new(array:Array):Array
  120.         {
  121.             for(var j:int, t:Number, i:int = array.length, a:Array = array.slice();i; j = Math.random() * i, t = a[--i], a[i] = a[j], a[j] = t);return a;
  122.         }
  123.         
  124.         public function shuffle_original(array:Array):Array
  125.         {
  126.             return array.slice().sort(function():int{return int(Math.random() * 3) - 1;});
  127.         }
  128.         
  129.         public function shuffle(array:Array):Array
  130.         {
  131.             return array.slice().sort(function():int{return Math.random() > 0.5 ? 1 : -1;});
  132.         }
  133.     }
  134. }
noswf
Get Adobe Flash Player