我在概率论方面不好。我想做的是:
我想把PERCEPTORS_NUMBER点放在一个圆圈里
我有unnormalized_distribution(r)函数。如果我们考虑两个圆半径r1和r2,那么:

等于

让我们把点与圆心的距离称为半径
所有点的半径范围为0;FOCUS_RADIUS。每个点的半径等于i/DISTRIBUTION_DISCRETIZATION_FREQUENCY,其中i是整数
我可以计算每个可能的半径的unnormalized_distribution,然后除以所有半径的unnormalized_distribution's之和。
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。
对于给定的点,我如何根据这个概率选择半径?
更新:解决方案代码:
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定义为
typedef long double ld;发布于 2014-09-15 10:27:30
有一个额外的步骤来创建和数组:
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的范围内。
https://stackoverflow.com/questions/25845814
复制相似问题