随机生成值1 / x

时间:2012-04-30 12:32:34

标签: java random

在java中,当我想生成gaussien值时,我直接使用

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

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

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

0.98
0.90
0.85
0.6
0.4
...

而不是

0.3
0.9
0.4
0.8
...

我们有一个关于java的解决方案吗?

3 个答案:

答案 0 :(得分:3)

查找以1/x

概率分布的值

1/x的积分是ln x,正如@dbaupp指出的那样,它无限制地增长。实际上,ln x当x逼近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))

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

因此,将从0到1的均匀分布值(例如从nextDouble获取)插入此函数将为您提供pdf = 1/x的值,范围从给定的min到max:

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,但我不了解浮点表示以了解是否存在问题,如果是,那么我不知道不知道一个数字需要多大/多大才能变成这样。它可能也不是很有用。一点点测试显示了许多非常微小的值和许多非常大的值 - 这并不奇怪,因为顶部和底部的积分接近无穷大。因此,要获得漂亮直方图的中等范围内的足够值,您需要 lot 值。

答案 1 :(得分:0)

您可能需要实现自己的转换方法。从Random实例中,您可以获得具有统一概率的数字的对象,并将这些数据用作方法的输入,以将其转换为您喜欢的任何分布。因此,您将获取生成的数字,并将其用于计算1 / x(不确定您的意思是什么......)并根据需要返回该操作的结果...

答案 2 :(得分:-1)

Random random = new SecureRandom();
double x = random.nextDouble();
return 1.0 / x; 

将为[x,1.0]

范围内的x提供1 / x的值

编辑 - 没有回答OP的问题,我误解了。