一种标准方法是找到一个明确的公式,G = F^-1
为累积分布函数的反函数。在这里这是可行的(尽管它自然会分段定义)然后使用G(U)
where U
在 [0,1] 上是均匀的以生成样本。
在这种情况下,我think我已经计算出详细信息,但您需要检查微积分/代数。
首先,为了简化事情,引入几个新参数会有所帮助。让
f(a,b,c,d,x) = c*x**2 #if 0 <= x <= a
and
f(a,b,c,d,x) = d*(x-e)**4 #if a < x <= b
那么你的p(x)
是(谁)给的
p(x) = f(a,b,c/a**2,c/b**2,a+b)
我综合了f
求累积分布,然后求逆,得到:
def Finverse(a,b,c,d,e,x):
if x <= (c*a**3)/3:
return (3*x/c)**(1/3)
else:
return e + ((a-e)**5 - (5*c*a**3)/(3*d))**(1/5)
假设这是正确的,那么简单地说:
def randX(a,b,c):
u = random.random()
return Finverse(a,b,c/a**2,c/b**2,a+b,u)
在这种情况下,可以制定出明确的公式。当您无法计算出这样的逆公式时,请考虑使用 @lucianopaz 描述的蒙特卡罗方法