Равномерно распределенные точки на плоскости становятся кластеризованными в java, почему?


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

Random r1=new Random();
  for(int i=0;i<100;i++){
  x=100*r1.nextDouble();
  y=100*r1.nextDouble();
} 
Но проблема в том, что, когда я снова и снова запускаю код, узлы не равномерно расположены на плоскости, то есть существуют кластеры концентраций и некоторые куски незанятого пространства.

Любые идеи, рекомендации будут высоко оценены. Следующее изображение показывает типичный вывод с кластерами и пробелами. Количество кругов - это просто идентификаторы кругов. Введите описание изображения здесь

2 7

2 ответа:

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

Вы можете использовать вместо этого что-то под названием последовательность с низким расхождением: например, последовательность Холтона или последовательность Соболя. Как вы можете видеть на примерах из Википедии, они избегают кластеров и пробелов, которые вы будете иметь при равномерном распределении.

Я предполагаю, что вы имеете в виду плоскость размером 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;
}