我遇到了一个问题,不太确定如何解决。 我有一个二维空间,其中有几个点。 我还有一个当前点,它是空间中的一个点。 我想随机选择另一个点,更靠近我的当前点的点被选中的概率更高。 我正在使用Java进行工作。 任何提示都将不胜感激。
我遇到了一个问题,不太确定如何解决。 我有一个二维空间,其中有几个点。 我还有一个当前点,它是空间中的一个点。 我想随机选择另一个点,更靠近我的当前点的点被选中的概率更高。 我正在使用Java进行工作。 任何提示都将不胜感激。
通过计算 1 / distanceFromCurrent
来为每个点分配一个“权重”。
基于这些权重选择一个点。
解决后面的问题可以在以下答案中找到:
另一个选择是使用java.util.Random.nextGaussian
。调整结果 double 值,使其表示合理的半径,并选择最接近该半径的相邻点。
你已经拥有所有的元素了^^
你想要的是,离当前点越远的点概率越小,因此你需要使用一个公式,其中距离减少概率,如:
1/d
d 是当前点和另一个点之间的距离。
所以你要做的就是计算每个点的概率 1/d,并将所有这些概率相加,得到你的总体或世界。
所以大致如下:
total = 0;
for(MyPoint p : list){
p.probability = 1/(distance(currentpoint,p);
total += p.probability;
}
Math.random*total;
并将其与您的要点列表进行比较 ^^;
杰森
/**
* @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的概率分布。)