我正在编写一个生成n个随机数x的函数,这样xmin

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的类似采样

10-08 18:57