在平面上随机选择点,更靠近的点被赋予更高的选择概率。

3

我遇到了一个问题,不太确定如何解决。 我有一个二维空间,其中有几个点。 我还有一个当前点,它是空间中的一个点。 我想随机选择另一个点,更靠近我的当前点的点被选中的概率更高。 我正在使用Java进行工作。 任何提示都将不胜感激。


你在寻找什么样的概率偏差?实际距离重要吗,还是你只关心按距离排序? - Dilum Ranatunga
实际距离很重要。我希望随机选择更青睐于欧几里得距离较近的点。 - Graham
3个回答

4

谢谢回复。我想从权重集合中选择一个点的实际任务可能是一个完全不同的问题。 - Graham

1

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

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

1/d

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

所以你要做的就是计算每个点的概率 1/d,并将所有这些概率相加,得到你的总体或世界。

所以大致如下:

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

然后你只需要做的是
Math.random*total;

并将其与您的要点列表进行比较 ^^;

杰森


谢谢,这也非常有用。我认为这是aioobe所谈论的解决方案类型的一个实例,但它帮助我理解了如何实际实现解决方案。 - Graham
是的,aioobe 给了你更短的版本,但它们具有相同的逻辑 ^^ - Jason Rogers

0
你需要一些距离函数作为概率分布的参数,更具体地说,你需要概率分布的累积分布函数(CDF)或反函数作为Java函数。
/**
 * @param distance
 * @return probability of choosing a point closer than distance
**/
double someCDF( double distance );

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

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

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

会给你想要的点(技术上来说,第一个概率小于或等于1减去均匀随机数的点,你可以证明在长期内会给你反向CDF的概率分布。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接