【问题标题】:Java using beta distribution to generate a random number from 0 to 1Java 使用 beta 分布生成一个从 0 到 1 的随机数
【发布时间】:2012-11-29 20:28:16
【问题描述】:

我需要使用 beta 分布 Beta(a, b) 来生成一个从 0 到 1 的随机数。

我找到了 BetaDist 类,它具有构造函数 BetaDist(double alpha, double beta),该构造函数使用参数 α = alpha 和 β = beta 以及默认域 (0, 1) 构造一个 BetaDist 对象。

但是,我找不到可以仅使用 alpha 和 beta 来使用 BetaDist 对象返回随机绘制 x (0, 1) 的方法。

我在 stackoverflow 上阅读了另一篇文章说: 从具有没有跳跃的 cdf 的任意分布生成随机数的一般方法是使用 cdf 的反函数:G(y)=F^{-1}(y)。如果 u(1), ..., u(n) 是均匀分布在 (0,1) 上的随机数,则 G(u(1)), ..., G(u(n)) 是随机数来自具有 cdf F(x) 的分布的样本。

BetaDist 类确实有 cdf(double x) 方法,但我仍然不知道下一步该做什么。我没学过统计学,上面的帖子对我来说还是太复杂了。

非常感谢。

【问题讨论】:

标签: java random beta


【解决方案1】:

我刚刚遇到了和你一样的问题。您提到的方案是有效的,我刚刚在我的案例中进行了测试。

程序如下:

  1. 生成一个 beta 分布——beta 参数为 alpha 和 beta;
  2. 从均匀分布中生成一个随机数 --x;
  3. 调用逆cdf获取beta分布的随机数--b,这里“x”作为函数输入,逆cdf可以返回你想要的随机数。注意:beta 分布应该有一个逆 cdf 来执行此操作,而不仅仅是 cdf。

    import org.apache.commons.math3.distribution.BetaDistribution;
    
    public class test {
        /**
         * @param args
         */
        public static void main(String[] args) {
            double x;
            double b;
            BetaDistribution beta = new BetaDistribution(40.0, 40.0);
            for (int i = 0; i < 100; i++) {
                x = Math.random();
                b = beta.inverseCumulativeProbability(x);
                System.out.println(b);
            }
        }
    }
    

【讨论】:

  • 实际上,如果您已经在使用 Apache commons BetaDistribution,您只需执行 beta.sample()。它继承了 AbstractRealDistribution 的示例方法。
猜你喜欢
  • 1970-01-01
  • 2014-10-17
  • 2011-05-10
  • 2012-11-21
  • 2017-05-28
  • 2013-11-21
  • 2021-06-03
  • 2011-01-16
  • 2014-04-11
相关资源
最近更新 更多