2011-05-26 74 views
3

我遇到了问题我不太清楚如何解决。我有一个有几个点的2D空间。我也有一个当前的观点,这是该领域的其中一个观点。我想随机选择其中一个点,选择的概率越高,就越接近我的当前点。我在Java工作。任何提示将不胜感激。随机选择飞机中的点,选择更接近点的概率更高

+0

你在寻找什么样的概率偏差?实际距离是否重要,还是只关心按距离排序? – 2011-05-26 20:38:09

+0

实际距离很重要。我希望随机选择偏爱以欧式距离更近的点。 – Graham 2011-05-26 20:40:21

回答

4
  1. 通过例如计算1/distanceFromCurrent为每个点分配“权重”。

  2. 根据这些权重选择一个点。对于后者部分

解可以例如在一些下面的答案中找到:


另一种选择是使用java.util.Random.nextGaussian。调整生成的双精度,使其表示合理的半径,然后选择最接近该半径的相邻点。

+0

感谢您的回复。我认为从权重集中选择一个点的实际任务本身可能是一个完全不同的问题。 – Graham 2011-05-26 22:03:33

1

你alraedy所有部件^^

你想要的是,远离因此它具有较小的概率要使用一个公式,其中的距离减小,如概率在当前点:

1/d

d为您的当前点与另一个之间的距离。

所以你要做的是计算每个点他们的概率1/d,并总结所有这些概率,让你的总数或世界。

所以喜欢的东西:

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

,然后你只需要做

Math.random*total; 

,并将它与你的观点的列表^^;

杰森

+0

谢谢,这也是非常有用的。我认为这是aioobe谈到的解决方案类型的一个实例,但它帮助我理解了我将如何实际实施解决方案。 – Graham 2011-05-26 22:04:59

+0

yep aioobe给你更短的版本,但它的逻辑相同^^ – 2011-05-27 17:46:00

0

你需要一些概率分布,距离的函数,更具体的,你需要的CDF或概率分布作为Java功能

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

一个可能的逆CDF选择是指数分布,并且相应的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的概率分布。)