助けてくれてありがとう。
Java でユーザー定義関数に従う乱数を作成する必要があります。これを行う一般的な方法は、関数の積分に一様分布を適用することです。問題は、積分できない関数の分布を作成する必要があること、または積分が非常に複雑または乱雑であることです。
1 つの例は、関数の分布に従う乱数を生成することです。
f(x) = (cos(x))^1.5
関数を定義でき、乱数を返すJavaの数学ライブラリはありますか? 推奨事項はありますか?
どうもありがとう!
助けてくれてありがとう。
Java でユーザー定義関数に従う乱数を作成する必要があります。これを行う一般的な方法は、関数の積分に一様分布を適用することです。問題は、積分できない関数の分布を作成する必要があること、または積分が非常に複雑または乱雑であることです。
1 つの例は、関数の分布に従う乱数を生成することです。
f(x) = (cos(x))^1.5
関数を定義でき、乱数を返すJavaの数学ライブラリはありますか? 推奨事項はありますか?
どうもありがとう!
分布をサンプリングする別の方法は、PDFのドメインと範囲内のランダムなポイントを(均一に)選択することです。ポイントがPDF曲線を下回っている場合は、それを返します。それ以外の場合は破棄して、再試行してください。
複数回サンプリングする必要があるため、これは逆CDFの評価よりも遅くなります。予想されるサンプル数は2/(D・R)です。ここで、Dはドメイン、RはPDFの範囲です。
abstract class Distribution {
public abstract double PDF(double value);
public abstract double getDomainMin();
public abstract double getDomainMax();
public abstract double getRangeMax();
protected Random rnd;
public Distribution() {
rnd = new Random();
}
public double sample()
{
double left = getDomainMin();
double right = getDomainMin();
double top = getRangeMax();
double x, y1, y2;
while (true) {
x = left + (right - left) * rnd.nextDouble();
y1 = top * rnd.nextDouble();
y2 = PDF(x);
if (y1 <= y2) return x;
}
return Double.NaN;
}
}
あなたがすでに知っていることを繰り返している場合はお詫びします:
ユーザーが逆CDFを定義 (または概算) する必要があります。計算できない場合は、分布からサンプリングし、よく知られている分布を使用して近似することをお勧めします。PDFからこれを行うライブラリは知りません。これがあれば、言語の乱数ジェネレータの一様ランダム性から関数へのマッピングを作成できます。パーセンタイル (たとえば、.5 = 50% -> 正規分布の平均) として機能する乱数を生成すると、ユーザーの関数を介して値にマップされます。