« アクセシビリティの厚い本 | MAIN | [as]TweenerのModifierをつくってみる »

[as]正規乱数

正規乱数というのは、統計確率の分野では形而上学的存在ではなかろうかと思われる正規分布(ガウス分布)に従う乱数のことで。今回はその乱数を生成するスクリプトです。

乱数の計算は、ボックス=ミューラー法を用いています。

package {

	public class Random {
		
		private static var generate_nrand_flg:Boolean = false;
		private static var generate_nrand_tmp:Number;
		
		/**
		 *	正規乱数
		 */
		public static function normal():Number{
			if ( generate_nrand_flg = !generate_nrand_flg ) {
				var u1:Number = Math.sqrt( -2.0*Math.log( Math.random() ) );
				var u2:Number = 2.0*Math.PI*Math.random();
				generate_nrand_tmp = u1*Math.sin(u2);
				return u1*Math.cos(u2);
			}else{
				return generate_nrand_tmp;
			}
		}
		
		/**
		 *	正規乱数集合
		 *	@param	size	サンプル数
		 *	@param	e		期待値(平均値)
		 *	@param	sigma	標準偏差
		 *	@return Array	Number[]
		 */
		public static function normals( size:uint ,e:Number=0.0 ,sigma:Number=1.0 ):Array{
			var result:Array = new Array(size);
			var i:uint;
			for ( i=1;i<size;i+=2){
				var u1:Number = Math.sqrt( -2.0*Math.log( Math.random() ) );
				var u2:Number = 2.0*Math.PI*Math.random();
				result[i]     = u1*Math.cos(u2)*sigma + e;
				result[i-1]   = u1*Math.sin(u2)*sigma + e;
			}
			if( i==size ){	
				result[size-1] = Math.sqrt( -2.0*Math.log( Math.random() ) ) * 
								 Math.cos( 2.0*Math.PI*Math.random() ) * sigma + e;
			}
			return result;
		}
	}
}

こんな感じで使います。


//正規乱数
var r:Number = Random.normal();

//任意数の正規乱数:数1000,平均0,分散1000
var rs:Array = Random.normals( 1000, 0.0, 10.0 );

正規乱数は、統計的なシミュレーションによく使いますが、いい感じのバラツキが欲しいときに使ったりします。例えばこんな感じで。

var num:uint = 500;
var xs:Array = Random.normals( num, 212, 70 );
var ys:Array = Random.normals( num, 212, 70 );
var ss:Array = Random.normals( num, 5, 2.5 );
var aa:Array = Random.normals( num, 0 ,2 );

for( var i:int=0; i<num; i++ ){
	graphics.beginFill( 0xffffff, Math.min(1.0,Math.abs(aa[i]/3)) );
	graphics.drawCircle( xs[i], ys[i], Math.abs(ss[i]) );
	graphics.endFill();
}

いろいろ値を変えると楽しかったりします。

COMMENT+

いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。

TRACKBACK

URL : http://nutsu.com/cgi/mt/mt-tb.cgi/70