要找到的概率分布的值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得到的,这个功能会给你一个值,并从给定的最小到最大:
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_VALUE,但我对浮点表示知之甚少,不知道这是否会产生问题,如果是的话,我不知道这样做需要多少/多少个数。它可能也不是很有用。一点测试显示了很多非常微小的值和很多非常大的值 - 这并不奇怪,因为顶部和底部的积分无限大。因此,要在漂亮的直方图中获得足够的middlish范围内的值,您需要一个值为的。
'1/x',你的意思是统一概率吗? – pablochan
对不起pablochan,但我不知道你的意思是一致的概率,我只是想随机生成几个值,并生成一组这样的值给像1/x一样的图! – Mehdi
这是不可能的! 1/x以下的区域是无限的。 – huon