2015-07-04 6 views
3

Я ищу алгоритм, в котором я могу установить псевдослучайные позиции в пределах данного окна просмотра (сверху, слева, ширине) без сохранения этих позиций. Скажем, у меня есть окно просмотра (от 0, 0) до (100, 100). Затем я найду элементы в (67, 25), (36, 42) и (1, 2). Если бы я изменил этот видовой экран с (-50, -50) до (50, 50), я бы все же нашел (36, 42) и (1,2), но тогда я также мог бы найти его на (-14 , 7) и (-32, -20). Я не знаю, как я могу сделать это яснее.Алгоритм позиционирования случайных элементов на бесконечной плоскости

+0

Является ли размер окна фиксированным? Является ли местоположение окна квантованным? – dlask

+0

Ничего не может быть. Я не уверен, что вы подразумеваете под квантованием. Учитывая, что это значит в физике, я не думаю. Я хочу иметь возможность создать систему, в которой есть бесконечное количество элементов, «случайно» распределенных на бесконечной плоскости, где я могу найти и отобразить только те, которые существуют в моем конкретном окне. – Jordan

+0

Просто предупреждение: вы не можете покрыть бесконечную плоскость *, используя вычисления с конечным числом бит. Другими словами, эта задача требует, чтобы наименее значимые биты все еще были доступны, даже если вы далеко продвинулись в своем окне, например. 10^1000. – dlask

ответ

2

Пример работы с целыми числами. Он также может быть изменен на float.

import random 

STEP = 10 # size of square with random points 
COUNT = 6 # number of random points in the square 

def get_points(x1, y1, x2, y2): 
    points = [] 
    sx = (x1 // STEP) * STEP 
    sy = (y1 // STEP) * STEP 
    for bx in range(sx, x2, STEP): 
     for by in range(sy, y2, STEP): 
      random.seed(bx + by) 
      for i in range(COUNT): 
       px = bx + random.randrange(STEP) 
       py = by + random.randrange(STEP) 
       if x1 <= px < x2 and y1 <= py < y2: 
        points.append((px, py)) 
    return points 

print get_points(0, 0, 10, 10) 
print get_points(0, 0, 100, 100) 

Весь самолет покрыт квадратами, содержащими случайные точки в зависимости от площади.

Вы найдете расположение нижнего левого квадрата (sx, sy), то вычислить расположение всех квадратов, которые необходимы для выбранного окна (bx, by). Вы инициализируете генератор случайных чисел, а затем генерируете все необходимые точки в квадрате (px, py). Но на самом деле рассматриваются только те точки, которые находятся внутри окна.

Просто для вдохновения.

+1

Ницца. Чтобы получить хорошо распределенные результаты, я думаю, вы хотите сгенерировать «COUNT», используемый для каждого квадрата из распределения Пуассона с соответствующим средним значением. (Хотя биномальный был бы более уместным в дискретном случае.) –

+0

Это круто, и его можно расширить в более высокие размеры, которые я также искал (не часть этого вопроса). Я думаю, это может сработать. – Jordan

+0

@ Джордан подтвержу. Вы можете использовать тот же подход и для точек в пространствах с большим количеством измерений. – dlask

Смежные вопросы