Wie generieren Sie zufällige Punkte in eine kreisförmige Verteilung
Frage ich mich, wie konnte ich generieren von Zufallszahlen, die in eine kreisförmige Verteilung.
Ich bin in der Lage, generieren Sie zufällige Punkte in einem rechteckigen Verteilung, so dass die Punkte generiert werden, die innerhalb der square (0 <= x < 1000, 0 <= y < 1000):
Wie würde ich mich beim generieren der Punkte im Kreis, so dass gilt:
(x−500)^2 + (y−500)^2 < 250000 ?
Vorsichtig sein müssen, wie die Berechnung erfolgt ist, jedoch. Wenn die Absicht ist, gleichmäßig verteilt random (x,y) - Werte, die innerhalb des Kreises, dann viele der Möglichkeiten, die für die Berechnung nicht geben, das Ergebnis.
mathworld.wolfram.com/DiskPointPicking.html
Lesen Sie this.
mathworld.wolfram.com/DiskPointPicking.html
Lesen Sie this.
InformationsquelleAutor Jack8246 | 2015-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
ERSTE ANTWORT:
Eine einfache Lösung wäre, zu überprüfen, um zu sehen, wenn das Ergebnis erfüllt Ihre Gleichung, bevor Sie fortfahren.
Generieren x, y (es gibt Wege, die zufällig in eine Auswahl)
Überprüfen Sie, ob ((x−500)^2 + (y−500)^2 < 250000) ist wahr
wenn nicht, erneuern.
Der einzige Nachteil wäre Ineffizienz.
ZWEITE ANTWORT:
ODER, Sie könnten etwas ähnliches tun zu riemann-Summen wie für die Angleichung der Integrale. Ungefähre Ihrem Kreis, der durch die Aufteilung in viele Rechtecke. (je mehr Rechtecke, desto genauer), und verwenden Sie Ihre Rechteck-Algorithmus für jedes Rechteck innerhalb Ihres Kreises.
Es ist tatsächlich ziemlich wahrscheinlich, dass das schneller als wenn man es "richtig", wenn man eine schnelle random number generator, da es vermeidet, Trigonometrie, Wurzeln, große zahlen und benutzt nur einen Anruf zu
random
im Durchschnitt.InformationsquelleAutor Bob
In deinem Beispiel
circle_x
500 alscircle_y
ist.circle_r
500.Andere version der Berechnung radius um gleichmäßig verteilten Punkten, basierend auf diese Antwort
Dieser Ansatz erzeugt nicht gleichmäßig verteilte Werte von (x,y), Sie werden mehr konzentriert in der Mitte als am Rand des Kreises. Wenn das das gewünschte Ergebnis, das ist schön und gut, aber wenn eine gleichmäßige Verteilung erforderlich ist, wird diese nicht zur Verfügung stellen.
Dies ist eine perfekte Gelegenheit, um die Verknüpfung zu einem der größten Probleme in der Wahrscheinlichkeitstheorie: Bertrand-Paradoxon.
EDIT: ich schlug vor, die Quadratwurzel der
random.random()
Teilr
. So wird es sein, eine gleichmäßige Verteilung.InformationsquelleAutor f43d65
Was Sie brauchen, ist, um die Probe aus (polar-form):
Können Sie dann wandeln
r
undtheta
zurück zu kartesischen Koordinatenx
undy
überVerwandte (wenn auch nicht Python), aber gibt die Idee.
Nein, es wird erzeugen Sie gleichmäßig verteilte Punkte auf der disc, beachten Sie, dass ich generating a uniform der Quadratwurzel des radius, nicht den radius selbst (was ja nicht im Ergebnis eine gleichmäßige Verteilung auf der Scheibe).
Ah, stimmt, ich sehe, was du tust. Ich denke, es könnte klarer sein, wenn Sie nur abgetastet von der Einheit Kreis, dann multipliziert und addiert danach, eher als sampling von r=500 Kreis.
InformationsquelleAutor vsoftco
Können Sie unter dem code, und wenn Sie möchten, um mehr zu erfahren
https://programming.guide/random-point-within-circle.html
InformationsquelleAutor Jewel Islam Shamim
Können Sie rejection sampling, generiert einen zufälligen Punkt innerhalb des
(2r)×(2r)
Platz, duckt sich der Kreis, wiederholen Sie, bis Sie einen Punkt innerhalb des Kreises.InformationsquelleAutor dlavila
Ich würde verwenden Polarkoordinaten:
r_squared, theta = [random.randint(0,250000), 2*math.pi*random.random()]
Dann r ist immer kleiner oder gleich dem radius, und theta immer zwischen 0 und 2*pi Radianten.
Da r ist nicht an die Herkunft, Sie wird sich immer wandeln es in einen Vektor zentriert bei 500, 500, wenn ich das richtig verstehe
x = 500 + math.sqrt(r_squared)*math.cos(theta)
y = 500 + math.sqrt(r_squared)*math.sin(theta)
Wählen Sie r_squared zufällig wegen diese
x = 500 + r*math.cos(theta)
y = 500 + r*math.sin(theta)
Ja?Ich sehe das problem: Ändern Sie den obigen code zu sein:
r_sqared, theta = [random.randint(0,250000), 2*math.pi*random.random()]
Dann anwenden einer Transformationx = 500 + math.sqrt(r_squared)*math.cos(theta)
y = 500 + math.sqrt(r_squared)*math.sin(theta)
InformationsquelleAutor fiacre