随机选择平面中的点,给予更近点的选择概率更高

时间:2011-05-26 20:34:48

标签: java random probability

我遇到了问题,我不太清楚如何解决。我有一个2d的空间,里面有几个点。我也有一个当前点,这是该空间中的一个点。我想随机选择另一个点,选择更接近我当前点的点的概率更高。我在Java工作。任何提示都将非常感激。

3 个答案:

答案 0 :(得分:4)

  1. 通过计算1 / distanceFromCurrent为每个点指定“权重”。

  2. 根据这些权重选择一个点。

  3. 后一部分的解决方案可以在以下一些答案中找到:


    另一种选择是使用java.util.Random.nextGaussian。调整生成的double,使其表示合理的半径,并选择最接近此半径的相邻点。

答案 1 :(得分:1)

你已经拥有了所有元素^^

你想要的是,距离当前点越远,它的概率越小,因此你想要使用一个公式,其中距离降低概率如下:

  

1 / d

d是当前点与另一点之间的距离。

所以你用它做的就是计算每个点的概率1 / d并总结所有这些概率以得到你的总数或世界。

如下所示:

total = 0;
for(MyPoint p : list){
   p.probability = 1/(distance(currentpoint,p);
   total += p.probability;
}

然后你只需要做

Math.random*total;

并将其与您的积分列表进行比较^^;

杰森

答案 2 :(得分:0)

你需要一些作为距离函数的概率分布,更具体地说,你需要CDF或概率分布的逆CDF作为java函数

/**
 * @param distance
 * @return probability of choosing a point closer than distance
**/
double someCDF( double distance );

一种可能的选择是指数分布,相应的CDF将是1-Math.exp( distance * r ),其中r对于缩放是一些常数。同样,您可以使用许多不同的功能,但这个功能非常容易编码。

然后按距离对点进行排序,

double rnum = Math.random();
for( Point point : sortedPoints )
    if( someCDF( distance(thisPoint,point) ) >= rnum )
        return point;

会给你你想要的点(技术上是被挑选概率小于或等于1的第一个点 - 均匀随机数,你可以证明它可以反馈长期反向CDF的概率分布运行。)