RandomVariate.RandomVariate (不均一乱数生成器)

  1. 文法
  2. 詳細
  3. 引数
  4. 戻り値
  5. 実装例

1. 文法

メンバ型
コンストラクタ
メンバ所有者
global.RandomVariate
呼び出し
new global.RandomVariate( urg, nonuniform )

2. 詳細

不均一乱数生成器を生成します。

3. 引数

urg (Object)
一様乱数発生器(Uniform random generator)オブジェクトを指定します。TJS標準のものであれば、Math.RandomGeneratorインスタンスか、Mathクラスそのものを指定します。
この引数に指定するオブジェクトは、random関数を実装している必要があります。random関数は、左閉右開区間[0,1)の一様乱数を返す関数です。独自の乱数生成器を指定する場合は、この仕様に基づいたrandom関数を実装してください。
nonuniform (Function)
不均一乱数生成関数(Non-uniform random generation function)を指定します。
この関数は、一つ以上の引数を受け取り、不均一乱数を返すTJS関数オブジェクトです。返す値の型は問いません。一つ目の引数は、urgで指定された乱数生成器のrandom関数(TJS関数オブジェクト)です。二つ目以降はオプション引数で、RandomVariate.generateオプション引数に指定されたものをそのまま受け取ります。
この関数は、RandomVariate.generateの実行時に呼ばれます。
累積分布関数の逆関数を実装するのが望ましいのですが、累積分布関数やその逆関数を導出するのが困難な場合には、棄却法など別の実装を用います。あるいは、以下の既存の実装を使用することもできます。

4. 戻り値

不均一乱数生成器インスタンスを返します。

5. 例

// 一様乱数発生器として、TJS2標準のMath.RandomGeneratorを使用します。
var generator = new Math.RandomGenerator();
// 正規分布に基づいた不均一乱数生成器を作成します。
// 不均一乱数生成関数には、既存の実装であるRandomVariate.gaussDistを使用します。
var randgen = new RandomVariate(generator, RandomVariate.gaussDist);
// σとμに基づいて乱数を生成します。
var mu = 0;
var sigma = 1.0;
var randval = randgen.generate(mu, sigma);

6. 実装例

大雑把ではありますが、不均一乱数生成関数nonuniformを、累積分布関数の逆関数で実装する場合の流れを示します。

  1. 確率密度関数を決める。
  2. 確率密度関数を積分して累積分布関数を求める。
  3. 累積分布関数の逆関数を求める。

例えば、乱数値の範囲が0〜1、確率密度関数f(x)が f(x) = ax (aは正の実数)であるような不均一乱数を実装する場合、以下のようになります。

範囲は[0,1)であることから、累積分布関数F(x)は、f(t)を0からxまで積分した F(x) = ax2/2 となります。範囲[0,1)の確率の累積が1であることから、F(x) = 1 (x→1) です。ここから a = 2 が得られるので、累積分布関数は F(x) = x2 です。uを[0,1)の一様な乱数とするとき、求める関数は、累積分布関数の逆関数 F-1(u) = u1/2となります。

よって、下記のように実装すればよいことになります。

function linear(random)
{
  var u = random();
  return Math.sqrt(u);
}

var randgen = new RandomVariate(myGenerator, linear);