使用 rand() 在 C++ 中进行线性分布

linear distribution in c++ using 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 的概率),将有一些修改,首先是 select 采样哪个分支:

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

的类似抽样