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

Java:根据用户定义的函数生成随机数,java,math,random,statistics,user-defined,Java,Math,Random,Statistics,User Defined,提前感谢您的帮助 我需要创建随机数,它遵循Java中用户定义的函数。实现这一点的一般方法是对函数的积分应用均匀分布。问题是我需要创建函数的分布,这些函数不能被积分,或者积分非常复杂或混乱 一个示例是生成随机数,该随机数将遵循函数的分布: f(x) = (cos(x))^1.5 Java中有没有数学库可以定义函数并返回随机数? 有什么建议吗 非常感谢 如果我重复您已经知道的内容,请道歉: 您需要用户定义(或近似)反向。如果你不能计算它,我建议从你的分布中取样,然后用一个已知的分布来近似它。我不知

提前感谢您的帮助

我需要创建随机数,它遵循Java中用户定义的函数。实现这一点的一般方法是对函数的积分应用均匀分布。问题是我需要创建函数的分布,这些函数不能被积分,或者积分非常复杂或混乱

一个示例是生成随机数,该随机数将遵循函数的分布:

f(x) = (cos(x))^1.5
Java中有没有数学库可以定义函数并返回随机数? 有什么建议吗


非常感谢

如果我重复您已经知道的内容,请道歉:


您需要用户定义(或近似)反向。如果你不能计算它,我建议从你的分布中取样,然后用一个已知的分布来近似它。我不知道有哪个库可以从PDF中为您实现这一点。一旦您有了它,您可以创建一个从您的语言中随机数生成器的统一随机性到函数的映射。当您生成一个随机数,该随机数将作为通过用户函数映射回该值的百分位数(例如.5=50%->正态分布的平均值)。

对分布进行采样的另一种方法是在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;
    }
}
抽象类分布{
公开摘要双PDF(双值);
公共抽象双getDomainMin();
公共抽象双getDomainMax();
公共抽象双getRangeMax();
受保护随机rnd;
公共分配(){
rnd=新随机数();
}
公共双样本()
{
左双=getDomainMin();
double right=getDomainMin();
double-top=getRangeMax();
双x,y1,y2;
while(true){
x=左+(右-左)*rnd.nextDouble();
y1=顶部*rnd.nextDouble();
y2=PDF(x);

如果(y1)你能从数字上近似CDF吗?你有关于函数的更多信息吗?你知道函数的定义域吗?它有界吗?我在寻找一种从用户定义函数创建随机数的通用方法,我写的函数只是一个。总之,在我的一般情况下,它可以有界,以防有帮助…T你给出的两个要求是不兼容的:你想要能够使用不需要有闭合形式积分的任意函数,你不想要使用任何形式的近似。这是不可能的。我认为数值积分PDF将是你最好的选择;如果高精度很重要,那么使用一个非常精确的数值积分。你是对的。我习惯于使用科学库(不是Java)您可以从任何函数生成分布,但这并不意味着它们不会对无法集成的函数进行近似,您只是看不到而已。如果我想在Java中这样做,我需要使用近似,正如您所说的,对于我需要的每个不同的函数,因为我真的没有找到一个能够自动实现这一点的库这将使我能够更流利地使用各种不同的功能:(非常感谢各位。问题是我使用的是科学数据,我希望尽可能避免近似值,这就是问题所在……无论如何,如果我能使用近似值,你们两个都会解决我的问题,再次感谢。