Java使用beta分布生成从0到1的随机数

时间:2012-11-29 20:28:16

标签: java random beta

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

我找到了类BetaDist,它有构造函数BetaDist(双alpha,双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)方法,但我仍然对下一步做什么感到迷茫。我还没有学习统计数据,上面的帖子对我来说仍然太复杂了。

非常感谢你。

1 个答案:

答案 0 :(得分:1)

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

程序如下:

  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);
            }
        }
    }