2

Javaでガウス値を生成したいときは、直接使用します

Random r = new Random();
r.nextGaussian(); 

しかし、今は Gauss の代わりに 1/x の確率で値を生成したい!

私のソリューションでは、ランダムな値を作成する必要がありますが、これらの値は 1 に近いものから始まります (ordred)。例 :

0.98
0.90
0.85
0.6
0.4
...

そしてそうではない

0.3
0.9
0.4
0.8
...

Javaで解決策がありますか?

4

3 に答える 3

3

確率で分布する値を見つけるには1/x

の積分1/xln xであり、@ dbauppが指摘したように、それは際限なく成長します。実際、ln xxが0に近づくときの限界は無限大(負)であり、正の無限大に成長するときの限界は無限大(正)です。

したがって、関数の範囲をある間隔に制限する必要があります。[min, max)ここで、min > 0および両方は有限です。

の逆関数q = ln xは、でx = e^qあるため、分位関数はですe^[(ln max - ln min)q + ln(min)]。ここで、qは区間に含まれます。[0,1)

少し代数の後、それは(max/min)^q * min=になります(max^q)(min^(1-q))

(どちらの形式が数値的に安定しているかはわかりません)

したがって、nextDoubleから取得するように、0から1の範囲の均一に分散された値をこの関数にプラグインするとpdf = 1/x、指定された最小値から最大値の範囲の値が得られます。

public static double reciprocalQuantile(double q, double min, double max) {
    return Math.pow(max, q)*Math.pow(min, 1-q);
}

だからあなたは言うことができます:

Random rand = new Random();
double value = reciprocalQuantile(rand.nextDouble(), 0.0001, 10000);

私は思う:-)私の数学をチェックしてください。

もう1つのポイント:もちろん、minをDouble.MIN_VALUEに、maxをDouble.MAX_VALUEに設定することもできますが、浮動小数点表現については、それが問題になるかどうかを知るのに十分な知識がありません。そのようになるには、数がどれだけ小さい/大きい必要があるか。また、あまり役に立たないかもしれません。少しのテストで、非常に小さな値と非常に大きな値が多数示されました。これは、上部と下部の積分が無限大に近づくため、驚くことではありません。したがって、きれいなヒストグラムを作成するために中程度の範囲で十分な値を取得するには、多くの値が必要になります。

于 2012-04-30T14:00:27.880 に答える
0

独自の変換方法を実装する必要がある場合があります。Random インスタンスから、一様確率で数値を取得するためのオブジェクトを取得し、これらをメソッドへの入力として使用して、好きな分布に変換します。したがって、生成された数値を取得し、それを 1/x の計算に使用し (その意味がわからない..)、必要に応じてその操作の結果を返します ...

于 2012-04-30T12:43:40.473 に答える
-1
Random random = new SecureRandom();
double x = random.nextDouble();
return 1.0 / x; 

範囲[0.0、1.0]のxの値1/xが得られます

編集-OPの質問に答えません、誤解しました。

于 2012-04-30T12:37:33.737 に答える