2015-07-25 8 views
7

ich auf einem Platz<random> uniform_real_distribution mit einem Mindestabstand zwischen den Punkten

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

mit einer Liste von Koordinaten bin zu erzeugen würde Ich mag zwischen zwei beliebigen Punkten, um sicherzustellen, dass ein Mindestabstand ist. Für meine Verwendung muss dies gelten, wenn periodische Randbedingungen angewendet werden.

  • Bevorzugte Lösung wäre eine eingebaute Methode in der <random> Bibliothek zu diesem. Gibt es irgendwelche?
  • Zweitbeste, jedes andere Paket enthält eine schnelle Möglichkeit, die Prüfung durchzuführen (solange es leicht zu verwenden ist).
  • Worst Case, ich kann meine eigenen grundlegenden Skript schreiben, die wäre O(n^2), wie ich bin nicht zu sehr mit Effizienz im Augenblick. Es sei denn, es gibt einen einfachen Algorithmus, der dies ausführen kann.
  • Andere Fragen um, wo entweder mit dem dritten Punkt oder mit anderen Umgebung aus <random>.

    +0

    Sie können Ihre Punkte in einen Container legen. Überprüfen Sie für den n-ten Punkt den Abstand zwischen den vorhandenen und es und fügen Sie es, wenn die Abstandsanforderung aktiviert ist, der Liste hinzu. Es ist nicht optimiert, aber es ist ein Ausgangspunkt. – Jepessen

    +0

    Wie viele Punkte müssen Sie generieren? –

    +0

    Im Moment bin ich okay mit höchstens 5000. In einem zweiten Moment würde ich wahrscheinlich viel mehr mögen, in der Größenordnung von einer Million. –

    Antwort

    2

    Während solche Sampling (die nicht überlappende Kreise Generation entspricht) auf math.stackexchange diskutiert wird, siehe https://mathematica.stackexchange.com/questions/2594/efficient-way-to-generate-random-points-with-a-predefined-lower-bound-on-their-p und https://mathematica.stackexchange.com/questions/69649/generate-nonoverlapping-random-circles, möchte ich auf eine andere mögliche Lösung, die Quasi-Zufallszahlen beinhaltet hinweisen. Für quasi-zufällige Sobol-Sequenzen gibt es eine Aussage, die besagt, dass es einen minimalen positiven Abstand zwischen Punkten gibt, der 0.5*sqrt(d)/N ist, wobei d die Dimension des Problems ist und N die Anzahl der im Hyperkubus abgetasteten Punkte ist. Papier vom Mann selbst http://www.sciencedirect.com/science/article/pii/S0378475406002382

    Verwandte Themen