提前感谢您的帮助。
我需要创建遵循Java中用户定义函数的随机数。这样做的一般方法是通过对函数的积分应用均匀分布。问题在于我需要创建无法集成的函数分布,或者积分非常复杂或混乱。
一个例子是生成跟随函数分布的随机数:
f(x) = (cos(x))^1.5
Java中是否有任何数学库可以定义函数并返回随机数? 有什么建议吗?
非常感谢!
答案 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;
}
}