2011-05-26 89 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的概率分佈。)