package { import flash.display.Sprite; import flash.text.TextFormat; import flash.text.TextFieldAutoSize; import flash.text.TextField; import flash.utils.Timer; import flash.events.Event; import flash.events.TimerEvent; [SWF(backgroundColor="0x281e19", frameRate="2")] public class Main extends Sprite { private var tf:TextField; private var n:uint; private var cVec:Vector.<Counter>; private var nk:uint; private var ns:uint; private var sum:Number; private var psum:Number; public function Main() { n = 100; cVec = new Vector.<Counter>(); nk = 1; ns = 0; sum = 0; psum = 0; addEventListener(Event.ADDED, onAdded); } private function onAdded(e:Event):void { removeEventListener(Event.ADDED, onAdded); var f:TextFormat = new TextFormat(); f.size = 11; f.color = 0xf2a00c; f.font = "monospace"; tf = new TextField(); tf.autoSize = TextFieldAutoSize.LEFT; tf.multiline = true; tf.background = true; tf.backgroundColor = 0x281e19; tf.defaultTextFormat = f; tf.text = "" addChild(tf); addEventListener(Event.ENTER_FRAME, onEnterFrame); var w:Number = stage.stageWidth / n; var h:uint = 2; var sh:uint = stage.stageHeight; for(var i:uint=0; i<n; ++i) { var c:Counter = new Counter(i, w, h, 0, sh-h); cVec[i] = c; addChild(c); addEventListener(Event.ENTER_FRAME, c.onEnterFrame); } var t:Timer = new Timer(0); t.addEventListener(TimerEvent.TIMER, onTimer); t.start(); } private function onEnterFrame(e:Event):void { var rns:Number = 1.0 / ns; var m:Number = sum * rns; var pm:Number = psum * rns; var v:Number = psum*rns - m*m; var max:uint = 0; var min:uint = 0xffffffff; var c:Counter; for each(c in cVec) { var count:uint = c.count; if(max < count) max = count; if(min > count) min = count; } for each(c in cVec) { c.scale(min, max); } tf.text = "s : " + ns + "\n" + "m : " + m.toFixed(4) + "\n" + "v : " + v.toFixed(4) + "\n" + "x : [0, 1)\n" + "ymax : " + max + "\n" + "ymin : " + min + "\n" + "ymax-ymin : " + (max - min); } private function onTimer(e:TimerEvent):void { var t:Number = (new Date()).getTime(); for(var k:uint=0; k<nk; ++k) { ++ns; var r:Number = Math.random(); sum += r; psum += r*r; cVec[uint(n*r)].inc(); } if(1 < (new Date()).getTime() - t) { --nk; } else { ++nk; } } } } import flash.display.Shape; import flash.events.Event; class Counter extends Shape { private var c:uint; private var s:Number; private var ymin:uint; private var ymax:uint; private var cmin:uint; private var cmax:uint; public function Counter( i:uint, w:Number, h:uint, ymin:uint, ymax:uint) { super(); c = 0; s = 1; this.ymin = ymin; this.ymax = ymax; x = i * w; y = ymax; with(graphics) { clear(); beginFill(0xf2a00c); drawRect(0, 0, w, h); endFill(); } } public function get count():uint { return c; } public function inc():uint { ++c; return c; } public function scale(min:uint, max:uint):void { cmin = min; cmax = max; } public function onEnterFrame(e:Event):void { var ny:int = int(ymax - (ymax - ymin)*(c - cmin)/(cmax - cmin)); if(ny != y) y = ny; } } Math.randomの分布