Слипаются ли случайно сгенерированные 2D точки и как мне это остановить? - PullRequest
2 голосов
/ 08 сентября 2010

Скажем, у вас есть 2D-область, и вы хотите генерировать случайные точки в ней, установив

x = random() * width 
y = random() * height 

точки сгущаются вокруг центра области? Я помню, что читал что-то, сказав, что они будут, но я не могу понять, почему и как это предотвратить.

Ответы [ 8 ]

4 голосов
/ 08 сентября 2010

Да. Чем меньше у вас точек, тем больше они будут образовывать кластеры.

Чтобы избежать этого, вы можете использовать «стратифицированную выборку». это в основном означает, что вы делите свою поверхность равномерно на более мелкие области и размещаете свои точки там.

Для вашего примера вы бы поделили квадрат на n * n подквадрат. Каждая точка будет размещена случайным образом внутри своего квадрата. Вы можете даже настроить коэффициент случайности, чтобы сделать шаблон более или менее случайным / регулярным:

// I assume random() return a number in the range [0, 1).

float randomnessFactor = 0.5;
int n = 100;

for(int ySub=0; ySub<n; ++ySub){
    for(int xSub=0; xSub<n; ++xSub){

        float regularity = 0.5 * (1-randomnessFactor)

        x = regularity + randomnessFactor * random() + xSub / (float) (n-1);
        x = regularity + randomnessFactor * random() + xSub / (float) (n-1);

        plot(x, y);

    }
}

Причина, по которой это работает, в том, что вы на самом деле не хотите случайности. (Глыбы являются случайными.) Вы хотите, чтобы точки распределялись равномерно, но без регулярного шаблона. Размещение точек на сетке и их смещение немного скрывают регулярность.

4 голосов
/ 08 сентября 2010

Действительно случайные точки создадут кластеры (или скопления) - это эффект, который может вызвать путаницу при отображении данных реального мира (например, случаев рака) и заставить людей думать, что существуют «горячие точки», которые должны быть вызваны чем-то.

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

3 голосов
/ 08 сентября 2010

Зависит от распределения генератора случайных чисел. Если предположить, что распределение равномерно, то точки, скорее всего, будут распределены достаточно равномерно.

Кроме того, вопрос о том, сгущаются ли они посередине, предполагает, что у вас нет возможности это проверить!

1 голос
/ 29 июля 2017

Псевдослучайные точки не обязательно будут группироваться «вокруг центра» области, но они будут иметь тенденцию группироваться в различных случайных точках в области;на самом деле эти скопления часто происходят чаще, чем думают люди.Более равномерное распределение пространства часто достигается с помощью так называемых квазислучайных или последовательностей с малым расхождением , таких как последовательность Соболя , чья статья в Википедии показывает график, иллюстрирующий различие между соболевыми и псевдослучайными последовательностями.

1 голос
/ 08 сентября 2010

Вы получите комок в начале координат, если вы используете полярные координаты вместо carthesian:

r = rand() * Radius;
phi = rand() * 2 * Pi;

Причина в том, что по статистике круг r=[0,1] будет содержать столько точек, сколько кольцо r=[1,2]хотя кольцо в три раза больше.

1 голос
/ 08 сентября 2010

Если функция random () генератора случайных чисел выдает гауссово распределение, то да.

1 голос
/ 08 сентября 2010

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

Хотя числа, сгенерированные с помощью random (), не являются истинно случайными, их будет достаточно для случайного размещения объектов на экране.

0 голосов
/ 19 октября 2010

Они не будут слипаться, но будут формировать различные интересные шаблоны, в 2d или 3d, в зависимости от используемого генератора.

...