首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用rand()在c++中的线性分布

问用rand()在c++中的线性分布
EN

Stack Overflow用户
提问于 2015-06-29 19:43:35
回答 1查看 905关注 0票数 2

我正在编写一个函数,它生成n个随机数x,使xmin

代码语言:javascript
复制
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()或另一种方法来完成这一任务?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-29 20:13:45

对于与某些线性函数成比例的PDF,CDF将与x平方成正比。因此,采样需要sqrt(),类似于

代码语言:javascript
复制
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这样的概率),将进行一些修改,首先选择要取样的分支:

代码语言:javascript
复制
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的相似采样

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31124231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档