提前感谢您的帮助。
我需要创建遵循 Java 中用户定义函数的随机数。这样做的一般方法是通过对函数的积分应用均匀分布。问题是我需要创建无法积分的函数分布,或者积分非常复杂或混乱。
一个示例是生成遵循函数分布的随机数:
f(x) = (cos(x))^1.5
Java中有没有可以定义函数并返回随机数的数学库?有什么建议吗?
非常感谢!
提前感谢您的帮助。
我需要创建遵循 Java 中用户定义函数的随机数。这样做的一般方法是通过对函数的积分应用均匀分布。问题是我需要创建无法积分的函数分布,或者积分非常复杂或混乱。
一个示例是生成遵循函数分布的随机数:
f(x) = (cos(x))^1.5
Java中有没有可以定义函数并返回随机数的数学库?有什么建议吗?
非常感谢!
抱歉,如果我重复您已经知道的内容:
您需要用户定义(或近似)逆CDF。如果你不能计算它,我建议从你的分布中抽样,然后使用一个众所周知的分布来近似它。我不知道有任何库可以从 PDF 中为您执行此操作。一旦有了这个,您就可以创建一个从您的语言中的随机数生成器的统一随机性到函数的映射。当您生成一个随机数作为百分位数(例如 0.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;
}
}