gpt4 book ai didi

java - 随机生成值 1/x

转载 作者:行者123 更新时间:2023-11-30 09:37:44 25 4
gpt4 key购买 nike

在java中我想生成高斯值的时候直接用

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

但现在我想生成一个概率为 1/x 的值而不是高斯!

在我的解决方案中,我必须创建一个随机值,但这些值以越接近 1 的值开始,依此类推(有序)。示例:

0.98
0.90
0.85
0.6
0.4
...

而不是

0.3
0.9
0.4
0.8
...

我们有 java 的解决方案吗?

最佳答案

要查找以 1/x 概率分布的值:

1/x 的积​​分是 ln x,正如@dbaupp 指出的那样,它无限增长。事实上,当 x 接近 0 时 ln x 的极限是无限的(负的),并且当它增长到正无穷大时的极限是无限的(正的)。

因此我们必须将函数的范围限制在某个区间 [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))

(我不确定哪种形式在数值上更稳定)

因此,将范围从 0 到 1 的均匀分布的值(例如您从 nextDouble 获得的值)插入此函数将为您提供具有 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);

我认为 :-) 请随时检查我的数学。

还有一点:您当然可以将 min 设置为 Double.MIN_VALUE,将 max 设置为 Double.MAX_VALUE,但我对浮点表示的了解还不够,无法知道这是否会产生问题,如果是,我不会不知道需要多小/多的数字才能变成这样。它也可能不是很有用。一些小测试显示出很多非常小的值和很多非常大的值——这并不奇怪,因为顶部和底部的积分接近无穷大。因此,要在漂亮的直方图的中间范围内获得足够的值,您需要很多值。

关于java - 随机生成值 1/x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com