Новое и улучшенное ; -)
Спасибо Гийому и Джейсону S за комментарии, которые заставили меня задуматься. Это привело ко второму предложению, статистика которого показывает значительное улучшение.
Гийом заметил, что предыдущая стратегия, которую я опубликовал, потеряет равномерную плотность. Конечно, он прав, потому что это, по сути, «прогулка пьяницы», которая стремится к исходной точке. Однако равномерное случайное размещение точек дает значительную вероятность неисполнения требования «пути» (все точки могут быть соединены путем без шага больше 100). Тестирование на это состояние стоит дорого; генерация чисто случайных решений до тех пор, пока не пройдет еще больше.
Джейсон С. предложил вариант, но статистическое тестирование на большом количестве симуляций приводит меня к выводу, что его вариация создает шаблоны, которые сгруппированы так же, как и в моем первом предложении (на основе изучения среднего и стандартного отклонения координаты). значения).
Пересмотренный алгоритм, приведенный ниже, создает наборы точек, характеристики которых очень похожи на характеристики чисто (равномерного) случайного размещения, но которые гарантированы конструкцией для удовлетворения требованиям пути. К сожалению, это немного проще визуализировать, чем устно объяснять. По сути, для этого требуется, чтобы точки случайным образом колебались в неопределенно постоянном направлении (NE, SE, SW, NW), меняя направление только при «отскакивании от стены».
Вот общий обзор:
Выберите начальную точку случайным образом, установите горизонтальное перемещение вправо и вертикальное перемещение вниз.
Повторите для оставшегося количества очков (например, 99 в исходной спецификации):
2,1. Случайным образом выберите dx и dy, расстояние между которыми составляет от 50 до 100. (Я предположил, что евклидово расстояние - квадратный корень из сумм квадратов - в моей пробной реализации, но расстояние "таксис" - сумма абсолютных значений - было бы еще проще кодировать.)
2,2. Применить dx и dy к предыдущей точке на основе горизонтального и вертикального перемещения (ВПРАВО / ВНИЗ -> добавить, ВЛЕВО / ВВЕРХ -> вычесть).
2,3. Если любая из координат выходит за границы (меньше 0 или не менее 1000), отразите эту координату вокруг нарушенной границы и замените ее перемещение противоположным направлением. Это означает четыре случая (2 координаты x 2 границы):
2.3.1. if x < 0, then x = -x and reverse LEFT/RIGHT horizontal travel.
2.3.2. if 1000 <= x, then x = 1999 - x and reverse LEFT/RIGHT horizontal travel.
2.3.3. if y < 0, then y = -y and reverse UP/DOWN vertical travel.
2.3.4. if 1000 <= y, then y = 1999 - y and reverse UP/DOWN vertical travel.
Обратите внимание, что отражения на шаге 2.3 гарантированно покидают новую точку в пределах 100 единиц от предыдущей точки, поэтому требование пути сохраняется. Однако ограничения по горизонтальному и вертикальному перемещению вынуждают генерацию точек случайным образом «проходить» по всему пространству, создавая более полную дисперсию, чем исходный алгоритм чистого «обхода пьяницы».