3

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

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

但是,我找不到可以仅使用 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) 方法,但我仍然不知道下一步该做什么。我没有学过统计学,上面的帖子对我来说还是太复杂了。

非常感谢您。

4

1 回答 1

2

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

程序如下:

  1. 生成一个 beta 分布——参数为 alpha 和 beta 的 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);
            }
        }
    }
    
于 2013-01-16T22:00:50.953 回答