【问题标题】:Generate value randomly 1/x随机生成值 1/x
【发布时间】:2012-04-30 12:32:33
【问题描述】:

在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”是指均匀概率吗?
  • 对不起,pablochan,但我不知道统一概率是什么意思,我只想随机生成几个值,并且生成的一组这些值给出了相同的图表,如 1 /x !
  • 这不可能! 1/x 以下的区域是无限的。
  • 如果你的数字真的是随机的,那么肯定有(随机的)机会,它们甚至可能不会给你期望的分布。
  • @user15992 - 你是说你需要一个随机数生成器,这样如果你重复生成随机数并绘制直方图,直方图就会类似于函数 1/x?

标签: java random


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      Random random = new SecureRandom();
      double x = random.nextDouble();
      return 1.0 / x; 
      

      将在 [0.0, 1.0] 范围内为 x 提供值 1/x

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

      【讨论】:

      • SecureRamdom ?!这对我来说是新的! SecureRandom 和简单的 Ramdon 有什么区别?
      • 奥利 - 嗯。你是对的,我的错 - 应该正确地认为:P
      • @user15992 SecureRandom 是一个加密性强的随机数生成器。因此,它的用途是为密码术创建随机密钥。它通常比 Random 慢很多,这里不需要使用它。
      猜你喜欢
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      相关资源
      最近更新 更多