2015-07-25 3 views
7

sto generando un elenco di coordinate in un quadrato utilizzando<random> uniform_real_distribution con distanza minima tra i punti

#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; 
} 

desidero assicurare che vi sia una distanza minima tra due punti. Per il mio utilizzo, questo deve valere quando vengono applicate condizioni al contorno periodiche.

  • La soluzione preferita sarebbe un metodo incorporato nella libreria <random>. C'è qualche?
  • In secondo luogo, qualsiasi altro pacchetto contenente un modo rapido per eseguire il controllo (purché sia ​​facile da utilizzare).
  • Nel peggiore dei casi, posso scrivere il mio script di base che sarebbe O(n^2) perché non mi preoccupo troppo dell'efficienza in questo momento. A meno che non ci sia un algoritmo facile da implementare in grado di farlo.

Altre domande su dove si gestiscono il terzo punto o con altro ambiente da <random>.

+0

Puoi mettere i tuoi punti in un contenitore. Per l'ennesimo punto, controlla la distanza tra quelle esistenti e, se il requisito di distanza è selezionato, aggiungilo alla lista. Non è ottimizzato, ma è un punto di partenza. – Jepessen

+0

quanti punti hai bisogno di generare? –

+0

In questo momento sto bene con circa 5000 al massimo. In un secondo momento, probabilmente mi piacerebbe molto di più, nell'ordine di un milione. –

risposta

2

Mentre tale campionamento (che equivale alla generazione di cerchi non sovrapposti) è discusso su math.stackexchange, vedere https://mathematica.stackexchange.com/questions/2594/efficient-way-to-generate-random-points-with-a-predefined-lower-bound-on-their-p e https://mathematica.stackexchange.com/questions/69649/generate-nonoverlapping-random-circles, vorrei segnalare un'altra potenziale soluzione che coinvolge numeri quasi casuali. Per le sequenze Sobol quasi casuali c'è una dichiarazione che dice che esiste una distanza minima positiva tra i punti che equivale a 0.5*sqrt(d)/N, dove d è la dimensione del problema e N è il numero di punti campionati nell'ipercubo. Carta dall'uomo stesso http://www.sciencedirect.com/science/article/pii/S0378475406002382