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. 実装例

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

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

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

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

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

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

var randgen = new RandomVariate(myGenerator, linear);