Взвешенные случайные координаты

Это может быть больше похоже на поиск термина, но решения также приветствуются. Я хочу создать n случайных координат x, y. Проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы, чтобы координаты были «взвешенными» или имели больше шансов приблизиться к определенной точке. Я создал что-то близкое, используя этот псевдокод:

x = rand(100) //random integer between 0 and 100
x = rand(x) //random number between 0 and the previous rand value
//randomize x to positive or negative
//repeat for y

Это работает, чтобы подтянуть объекты к 0,0, однако, если вы создадите достаточное количество точек, вы сможете увидеть шаблон осей x и y. Это связано с тем, что даже если x удается достичь 100, высоки шансы, что y будет ближе к этому значению.

Я пытаюсь избежать образования этой линии x, y. Бонусные баллы, если есть способ добавить несколько «взвешенных координат», к которым будут тяготеть случайные координаты, а не к статическим 0,0.


person kwolfe    schedule 16.05.2014    source источник


Ответы (1)


Это проще в полярных координатах. Все, что вам нужно сделать, это сгенерировать равномерный случайный угол и расстояние, распределенное по мощности. Вот пример на Python:

import math
from random import random

def randomPoint(aroundX, aroundY, scale, density):
  angle = random()*2*math.pi

  x = random()
  if x == 0:
    x = 0.0000001

  distance = scale * (pow(x, -1.0/density) - 1)
  return (aroundX + distance * math.sin(angle),
          aroundY + distance * math.cos(angle))

Вот распределение randomPoint(0, 0, 1, 1):

Точки разбросаны, более плотные в начале координат

Мы можем сместить его в центр вокруг другой точки, например 1,2, с помощью randomPoint(1, 2, 1, 1):

Точки разбросаны, плотнее на 1,2

Мы можем распространиться на большую площадь, увеличив масштаб. Вот randomPoint(0, 0, 3, 1):

Точки случайным образом распределяются по большей площади

И мы можем изменить форму, то есть склонность к слипанию, изменив плотность. randomPoint(0, 0, 1, 3):

Точки точно сосредоточены вокруг начала координат

person that other guy    schedule 16.05.2014
comment
Я знал, что парень с питоном будет здесь с ответом. Вероятно, я мог бы запустить это несколько раз, чтобы получить несколько взвешенных координат в одной плоскости. Спасибо - person kwolfe; 16.05.2014