2012-04-30 45 views
2

在java中当我要生成一个高斯(Gaussien)值,我直接用生成随机值1/X

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的解决方案?

+2

'1/x',你的意思是统一概率吗? – pablochan

+0

对不起pablochan,但我不知道你的意思是一致的概率,我只是想随机生成几个值,并生成一组这样的值给像1/x一样的图! – Mehdi

+7

这是不可能的! 1/x以下的区域是无限的。 – huon

回答

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

会给你一个值1/X为X的范围为[0.0,1.0]

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

+2

这与1/x概率的数字不一样...... –

+0

SecureRamdom?!这对我来说是新的! SecureRandom和简单的Ramdon有什么区别? – Mehdi

+0

Oli - 嗯。你是对的,我的坏 - 应该认为,通过正确:P – mcfinnigan

0

您可能需要实现自己的转换方法。从随机实例中,您可以获得具有统一概率的数字的对象,并将这些数据用作您的方法的输入,以将其转换为您喜欢的任何分布。所以,你会采取生成的号码,并用它来计算的1/X(不知道你的意思。)并返回,因为你需要该操作的结果......

3

要找到的概率分布的值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范围内的值,您需要一个值为