Java 随机生成值1/x

Java 随机生成值1/x,java,random,Java,Random,在java中,当我想要生成高斯值时,我直接使用 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的解决方案吗 Random random = new SecureRandom(); dou

在java中,当我想要生成高斯值时,我直接使用

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

Random random = new SecureRandom();
double x = random.nextDouble();
return 1.0 / x; 
将为[0.0,1.0]范围内的x提供1/x的值


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

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

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

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

因此,我们必须将函数的范围限制在某个区间
[min,max)
,其中
min>0
,两者都是有限的

q=lnx
的倒数是
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_值,将max设置为Double.max_值,但我对浮点表示法了解不够,不知道这是否有问题,如果有问题,我也不知道一个数字需要多小/多大才能成为问题。这也可能不是很有用。一个小测试表明f非常小的值和很多非常大的值——这并不奇怪,因为顶部和底部的积分接近无穷大。因此,要在中等范围内获得足够的值来绘制一个漂亮的直方图,你需要很多值。

所谓的“1/x”,你指的是均匀概率吗?对不起,巴布罗坎,但我不知道你说的“统一”是什么意思m概率,我只想随机生成几个值,生成的一组值给出一个类似于1/x的图!这是不可能的!1/x下的面积是无限的。如果你的数字是真正随机的,肯定有(随机的)可能他们甚至没有给你你期望的分布。@user15992-你是说你需要一个随机数生成器,这样如果你重复生成随机数并绘制直方图,直方图就会像函数1/x?SecureRamdom?!这对我来说是新的!SecureRandom和simple有什么区别拉姆登?奥利-嗯。你说得对,我的坏-应该好好想想:P@user15992是一个加密功能强大的随机数生成器。因此,它用于创建用于加密的随机密钥。它通常比random慢得多,这里不需要使用它。