c++中使用rand()的线性分布



我正在编写一个函数,该函数生成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)

更新

如果您想使用p1p2(假设它们是概率,使得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 的类似采样

最新更新