| INDEX |

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

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

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();
}

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

| INDEX |