首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按照给定的“相对概率”将n个点分布在一个圆内,每个点都与一个圆中心有一定距离?

如何按照给定的“相对概率”将n个点分布在一个圆内,每个点都与一个圆中心有一定距离?
EN

Stack Overflow用户
提问于 2014-09-15 10:21:41
回答 1查看 133关注 0票数 1

我在概率论方面不好。我想做的是:

我想把PERCEPTORS_NUMBER点放在一个圆圈里

我有unnormalized_distribution(r)函数。如果我们考虑两个圆半径r1r2,那么:

等于

让我们把点与圆心的距离称为半径

所有点的半径范围为0;FOCUS_RADIUS。每个点的半径等于i/DISTRIBUTION_DISCRETIZATION_FREQUENCY,其中i是整数

我可以计算每个可能的半径的unnormalized_distribution,然后除以所有半径的unnormalized_distribution's之和。

代码语言:javascript
复制
ld distribution_integral=0;
ld probabilities[FOCUS_RADIUS*DISTRIBUTION_DISCRETIZATION_FREQUENCY+1];
for(int i=0;i<=FOCUS_RADIUS*DISTRIBUTION_DISCRETIZATION_FREQUENCY;++i)
{
    distribution_integral+=probabilities[i]=unnormalized_distribution(((ld)i)/DISTRIBUTION_DISCRETIZATION_FREQUENCY);

}
for(int i=0;i<=FOCUS_RADIUS*DISTRIBUTION_DISCRETIZATION_FREQUENCY;++i)
{
    probabilities[i]/=distribution_integral;
}

然后,对于每个半径,我将得到在0;1范围内的概率,某个点会有它。所有概率之和为1。

对于给定的点,我如何根据这个概率选择半径?

更新:解决方案代码:

代码语言:javascript
复制
ld distribution_integral=0;
ld probabilities_sums[FOCUS_RADIUS*DISTRIBUTION_DISCRETIZATION_FREQUENCY+1];
for(int i=0;i<=FOCUS_RADIUS*DISTRIBUTION_DISCRETIZATION_FREQUENCY;++i)
{
    distribution_integral+=probabilities_sums[i]=unnormalized_distribution(((ld)i)/DISTRIBUTION_DISCRETIZATION_FREQUENCY);

}
for(int i=0;i<=FOCUS_RADIUS*DISTRIBUTION_DISCRETIZATION_FREQUENCY;++i)
{
    probabilities_sums[i]/=distribution_integral;
    if(i!=0)
        probabilities_sums[i]+=probabilities_sums[i-1];
}
srand(time(0));
ld chosen_x_list[PERCEPTORS_NUMBER];
ld chosen_y_list[PERCEPTORS_NUMBER];
for(int i=0;i<PERCEPTORS_NUMBER;++i)
{

    ld random_value=((double)rand())/RAND_MAX;
    ld best_diff=2;
    int best_ind=0;
    int r=FOCUS_RADIUS*DISTRIBUTION_DISCRETIZATION_FREQUENCY,l=0,m;
    while(r>=l)
    {
        m=l+(r-l)/2;
        if(probabilities_sums[m]>random_value)
        {
            if(m==0)
                best_ind=0;
            else if(probabilities_sums[m-1]<=random_value)
                best_ind=m;

            r=m-1;
        }
        else
            l=m+1;
    }
    ld chosen_radius=((ld)best_ind)/DISTRIBUTION_DISCRETIZATION_FREQUENCY;
    ld chosen_angle=(ld)(rand()%360);
    fprintf(stderr,"%f\n",(float)chosen_angle);
    //chosen_angle=0;

    ld chosen_x,chosen_y;
    chosen_x_list[i]=chosen_radius*cos(dtr(chosen_angle));
    chosen_y_list[i]=chosen_radius*sin(dtr(chosen_angle));
}
printf("%d\n",PERCEPTORS_NUMBER);
for(int i=0;i<PERCEPTORS_NUMBER;++i)
{
    printf("%f %f\n",(float)chosen_x_list[i],(float)chosen_y_list[i]);
}

ld定义为

代码语言:javascript
复制
typedef long double ld;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-15 10:27:30

有一个额外的步骤来创建和数组:

代码语言:javascript
复制
aux[0] = 0
aux[i] = aux[i-1] + probabilities[i-1]

注意,这个数组是单调增加的,aux[i]-aux[i-1] = probabilities[i-1]probabilities[n] = 1

在范围(0,1)中绘制一个随机的实数(或双)数(让它是r),并选择带有索引i这样的that aux[i-1] <= r < aux[i]的焦点。

后者可以使用二进制搜索高效地完成,因为您的数组是排序的。

因此,通过绘制一个均匀分布(0,1)的数字,它就完全有可能在元素i的范围内。

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

https://stackoverflow.com/questions/25845814

复制
相关文章

相似问题

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