Java:根据用户定义的函数生成随机数

时间:2012-07-13 18:03:26

标签: java math random statistics user-defined

提前感谢您的帮助。

我需要创建遵循Java中用户定义函数的随机数。这样做的一般方法是通过对函数的积分应用均匀分布。问题在于我需要创建无法集成的函数分布,或者积分非常复杂或混乱。

一个例子是生成跟随函数分布的随机数:

f(x) = (cos(x))^1.5

Java中是否有任何数学库可以定义函数并返回随机数? 有什么建议吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

如果我重复你已经知道的事情,请道歉:

您需要用户定义(或近似)逆CDF。如果你无法计算它,我会建议从你的发行版中抽样,然后使用一个众所周知的发行版来近似它。我不知道有哪些库会从PDF中为您执行此操作。一旦您有了这个,您可以创建一个映射,从您的语言随机数生成器的均匀随机性到函数。当您生成一个随机数,该数字将作为百分位数(例如.5 = 50% - >正常分布的平均值)通过用户函数映射回值。

答案 1 :(得分:1)

对分布进行采样的另一种方法是在PDF的域和范围中选择一个随机点(统一)。如果该点低于PDF曲线,则将其返回。否则丢弃它,然后再试一次。

这比评估逆CDF要慢,因为你必须多次采样。预期的样本数为2 /( D · R ),其中 D 是域, R PDF范围。

abstract class Distribution {
    public abstract double PDF(double value);
    public abstract double getDomainMin();
    public abstract double getDomainMax();
    public abstract double getRangeMax();

    protected Random rnd;

    public Distribution() {
        rnd = new Random();
    }

    public double sample()
    {
        double left = getDomainMin();
        double right = getDomainMin();
        double top = getRangeMax();

        double x, y1, y2;
        while (true) {
            x = left + (right - left) * rnd.nextDouble();
            y1 = top * rnd.nextDouble();
            y2 = PDF(x);
            if (y1 <= y2) return x;
        }
        return Double.NaN;
    }
}