new global.RandomVariate( urg, nonuniform )
不均一乱数生成器を生成します。
不均一乱数生成器インスタンスを返します。
// 一様乱数発生器として、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);
大雑把ではありますが、不均一乱数生成関数nonuniformを、累積分布関数の逆関数で実装する場合の流れを示します。
例えば、乱数値の範囲が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);