如果我们想使随机数在一个区间 [a,b] 内均匀生成,那么很容易实现:
A=rand()*(b-a) + a
rand()
是一个函数,它可以生成介于0和1之间的均匀随机数。所以A
是[a,b]
中的随机数。
对于基于分布函数(例如y=x-x^2
)生成随机数时,我遇到了问题。
我想使用这里提到的方法。但我不想使用Python函数inverse_cdf(np.random.uniform())
。
我可以通过在0和X上进行积分来计算函数“y”的CDF,并将其称为“f”。但是,当我将rand()函数(介于0和1之间的数字)放入f的反函数中时,会得到一个复数!
也就是说:A=f^(-1) (rand())
返回一个复数。
这是基于分布函数生成随机数的正确方法吗?
我使用了这个网站来计算f=x^2/2 - x^3/3
的反函数,下面的代码是计算的一部分,显示tmp1
始终为负数。
for i=1:10
rnd1=rand;
tmp1 = 2*sqrt(6)*sqrt(6*rnd1^2-rnd1)-12*rnd1+1
cTmp1 = tmp1^(1/3)
end
x-x^2
仅在0 ≤ x ≤ 1
时为正。在该范围内进行积分可得面积为1/6
。因此,您可以通过指定f(x) = 6(x - x^2) for 0 ≤ x ≤ 1; 0 otherwise
来使其成为有效密度。但是,您还可以添加一个常数来将方程向上或向下移动,这将影响范围和结果面积。那么您想要的实际密度是什么? - pjsf(x)
的积分,得到了CDF为F(z)=3z^2-2z^3
。问题在于反演这个函数,再次给我sqrt(X^2-X)
。因此,如果我将一个随机变量放在0和1之间,我会得到一个复数。 - Denis