2013-10-11 4 views
7

Я хочу создать равномерно распределенные круги/точки/узлы на плоскости * 100. Для этого я использую метод Random() в java. В частности, я делаю это в следующим образом:Равномерно Распределенные точки на плоскости собираются в java, почему?

Random r1=new Random(); 
    for(int i=0;i<100;i++){ 
    x=100*r1.nextDouble(); 
    y=100*r1.nextDouble(); 
} 

Но проблема заключается в том, что, как я запускаю код снова и снова, узлы не равномерно распределены на плоскости, то есть, есть кластеры концентраций и некоторые куски незанятого пространства.

Любые идеи, рекомендации будут высоко оценены. Представления изображения показывают типичный результат с кластерами и пробелами. Число кругов - это только идентификаторы окружностей. enter image description here

+6

Это распространенное заблуждение, что случайные числа являются неклассифицированными. Они, безусловно, действительно образуют кластеры, если их недостаточно. Если вы хотите однородность, тогда создайте единый генератор (разделите плоскость равномерно и наложите точки соответственно). – Adam

+0

Благодарим за отзыв, вы можете уточнить, пожалуйста. Я не получил той части, где и сказал, чтобы разделить плоскость равномерно и поместить узлы соответственно. – OAH

+0

@Anderson Вы должны взглянуть на [проблему рождения] (http://en.wikipedia.org/wiki/Birthday_problem). – SpaceTrucker

ответ

5

Если вы хотите, чтобы ваша случайная чтобы выглядеть более «четным», то есть вы хотите более равномерно распределить пространство, вы не можете использовать полностью равномерное распределение, так как оно будет содержать «пробелы», как указывал @Adam.

Вы можете использовать вместо него то, что называется Low-discrepancy sequence: Halton sequence например, или Sobol sequence. Как вы можете видеть в примерах Википедии, они избегают кластеров и пробелов, которые у вас будут с равномерными распределениями.

+0

Большое спасибо, я быстро увидел фотографии в Википедии, и это именно то, что я ищу случайным, но без пробелов.Просто быстрый вопрос, так ли эти «последовательности с низким рассогласованием» считаются некоторой реализацией равномерного распределения? потому что они выглядят равномерно распределенными для меня. Еще раз спасибо. – OAH

+1

Они однородны. Легко видеть последовательность Halton, она просто подразделяет диапазон равномерно на x и равномерно на y, просто отличается «равномерно». – Adam

+0

@Flavio знаете ли вы, что лучший способ добавить дрожание будет? Очевидно, вы можете случайным образом нарушить координаты, но как это повлияет на единообразие? – Adam

1

Я предполагаю, что вы имеете в виду плоскость 100x100, с 100 точками.

Сетка 10x10, наложенная на вашу плоскость, с 1 точкой на ячейку сетки означает 100 равномерно распределенных точек.

Место точки в центре для точного единообразия, что довольно:

for(int i=0;i<100;i++){ 
    x = 5 + 10*(i/10); 
    y = 5 + i % 10; 
} 

Или немного джиттера, Рандомайз расположение внутри каждой коробки сетки:

Random r1=new Random(); 
for(int i=0;i<100;i++){ 
    x = 10*r1.nextDouble() + 10*(i/10); 
    y = 10*r1.nextDouble() + i % 10; 
} 
+0

Большое спасибо за это. Однако я ищу что-то, что не является сеткой. Я имею в виду, глядя на круги на прилагаемой фигуре, некоторые части так сильно загружены, а другие - не некоторые. Я ищу способ перейти от экстремальной настройки, которая у меня есть сейчас к некоторому более однородному распределению (но не к сетке). Есть ли что-нибудь, что я могу сделать с генератором случайных чисел, т. Е. Использовать 2-й R.N.G для Y-координат или что-то в этом роде? Thx – OAH

+0

Второй подход можно настроить, используя большую/меньшую сетку для управления вашей однородностью. Если вы используете сетку 5x5 с 4 случайными точками в поле, тогда у вас больше случайности, меньше однородности, но не так много, как в вашем решении. На самом деле ваше решение - это то, что происходит с сеткой 1x1. – Adam

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