Вам нужно некоторое распределение вероятностей, которое является функцией расстояния, более конкретно, вам нужен 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 в долгосрочной перспективе.)