我需要使用β分布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)方法,但我仍然对下一步做什么感到迷茫。我还没有学习统计数据,上面的帖子对我来说仍然太复杂了。
非常感谢你。答案 0 :(得分:1)
我刚刚遇到了和你一样的问题。你提到的方案是有效的,我刚刚在我的案例中测试过。
程序如下:
调用逆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);
}
}
}