我正在编写一个生成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()或其他方法完成吗?
答案 0 :(得分:1)
对于与某些线性函数成比例的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