我正在编写一个生成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)更新
如果要使用
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
的类似采样