Случайный выбор точек на плоскости с более высокой вероятностью выбора для более близких - PullRequest
3 голосов
/ 27 мая 2011

У меня проблема, я не слишком уверен, как ее решить. У меня есть 2D-пространство с несколькими точками в нем. У меня также есть текущая точка, которая является одной из точек в пространстве. Я хочу случайным образом выбрать одну из других точек с более высокой вероятностью выбора точек, расположенных ближе к моей текущей точке. Я работаю на Java. Любые советы будут высоко оценены.

Ответы [ 3 ]

4 голосов
/ 27 мая 2011
  1. Назначьте «вес» каждой точке, например, вычисляя 1 / distanceFromCurrent.

  2. Выберите точку на основе этих весов.

Решение для последней части, например, можно найти в некоторых из следующих ответов:


Другой вариант будетиспользуйте java.util.Random.nextGaussian.Отрегулируйте получившийся двойник так, чтобы он представлял разумный радиус, и выберите соседнюю точку, ближайшую к этому радиусу.

1 голос
/ 27 мая 2011

у вас есть все элементы ^^

вам нужно, чтобы чем дальше от текущей точки, тем меньше вероятность ее возникновения, поэтому вы хотите использовать формулу, в которой расстояние уменьшает вероятность, например:

1 / d

d - расстояние между вашей текущей точкой и другой.

Итак, что вы делаете с этим, вычисляете для каждой точки их вероятность 1 / d и суммируете все эти вероятности, чтобы получить свою общую сумму или мир.

так что-то вроде:

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

и тогда вам нужно только сделать

Math.random*total;

и сравните его с вашим списком точек ^^;

Jason

0 голосов
/ 27 мая 2011

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

...