2015-07-25 12 views
7

jestem generujących listę współrzędnych na placu przy użyciu<random> uniform_real_distribution z minimalnej odległości pomiędzy punktami

#include <random> 
using namespace std; 

int main(){ 

random_device rd; 
long int seed = rd(); 
default_random_engine gen(seed); 

double max=10.0, min=-10.0; 
uniform_real_distribution<double> uni_real(min,max); 

double random_x = uni_real(gen); 
double random_y = uni_real(gen); 

return 0; 
} 

Chciałbym zapewnić, że nie jest to minimalna odległość między dwoma dowolnymi punktami. Do mojego użytku, musi to być spełnione, gdy stosowane są okresowe warunki brzegowe.

  • Preferowane rozwiązanie to wbudowana metoda z biblioteki <random>. Czy jest jakiś?
  • Druga najlepsza, każda inna paczka zawierająca szybki sposób wykonania kontroli (o ile jest łatwa do użycia).
  • W najgorszym przypadku mogę napisać własny skrypt, który byłby O(n^2), ponieważ nie jestem zbytnio zainteresowany wydajnością w tej chwili. Chyba że istnieje jakiś prosty algorytm do wdrożenia, który może to zrobić.

Inne pytania dotyczące miejsca trzeciego punktu lub innego środowiska z <random>.

+0

Możesz umieścić swoje punkty w pojemniku. Dla n-tego punktu sprawdź odległość między istniejącymi i nim, a jeśli jest zaznaczone wymaganie odległości, dodaj je do listy. Nie jest zoptymalizowany, ale jest punktem wyjścia. – Jepessen

+0

ile punktów potrzebujesz wygenerować? –

+0

Teraz jestem w porządku z około 5000 w najlepszym razie. W drugiej chwili prawdopodobnie chciałbym o wiele więcej, rzędu miliona. –

Odpowiedz

2

Podczas gdy takie pobieranie próbek (które jest równoważne generowaniu niezakładających się okręgów) jest omawiane na matematyce.stackexchange, zobacz https://mathematica.stackexchange.com/questions/2594/efficient-way-to-generate-random-points-with-a-predefined-lower-bound-on-their-p i https://mathematica.stackexchange.com/questions/69649/generate-nonoverlapping-random-circles, chciałbym zwrócić uwagę na inne potencjalne rozwiązanie, które obejmuje quasi-losowe liczby. Dla quasi-losowych sekwencji Sobola jest stwierdzenie, które mówi, że istnieje minimalna dodatnia odległość między punktami, która wynosi 0.5*sqrt(d)/N, gdzie d jest wymiarem problemu, a N jest liczbą punktów próbkowanych w hiperszeście. Papier od samego mężczyzny http://www.sciencedirect.com/science/article/pii/S0378475406002382

Powiązane problemy