我正在编写一个函数,该函数生成n个随机数x,使得xmin<x<xmax。使用rand()进行均匀分布很容易做到这一点。
int points[n];
for (int i = 0; i < n; i++) {
points[i] = rand() % (xmax - xmin) + xmin;
}
然而,我想控制分布,使给定x值的概率为px = (px2 * (x - xmin) + px1 * (xmax - x)) / (xmax - xmin)
,其中px1和px2是常数。换句话说,就是线性分布。
我可以通过将区间划分为足够小的离散区间,并对每个区间使用上面的算法来伪造这一点,其中n与子区间的平均概率成比例。然而,我更愿意在区间中应用连续分布。这可以通过使用rand()或其他方法来实现吗?
对于与某个线性函数成比例的PDF,CDF将与x
的平方成比例。因此,采样需要sqrt(),类似
x = xmin + sqrt(urand())*(xmax - xmin);
y = ymin + sqrt(urand())*(ymax - ymin);
其中urand()是U(0,1)RNG(可能等于rand()/RAND_MAX
,但我很久以前就放弃了rand(),转而使用C++11)
更新
如果您想使用p1
和p2
(假设它们是概率,使得p1+p2=1),则需要进行一些修改,首先选择要采样的分支:
r1 = urand();
if (r1 < p2) // range [0...p2), first branch
x = xmin + sqrt(urand())*(xmax-xmin);
else // range [p2...1), range length is 1-p2=p1
x = xmax - sqrt(urand())*(xmax-xmin);
y
的类似采样