我正在编写一个函数,它生成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()或另一种方法来完成这一任务?
发布于 2015-06-29 20:13:45
对于与某些线性函数成比例的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的相似采样
https://stackoverflow.com/questions/31124231
复制相似问题