Ich möchte eine Folge von Zahlen erzeugen, um prozedural Planeten in einem Galaxiensektor zu erzeugen. Jeder Planet sollte zufällig platziert werden, es sollte jedoch sehr unwahrscheinlich sein, dass zwei Planeten direkt nebeneinander liegen. Wie kann ich das erreichen?
Ich weiß, dass Sie die Chancen durch Anwenden einer Verteilungsfunktion ändern können, aber wie kann ich sie steuern, um bestimmte Werte mehr oder weniger wahrscheinlich zu machen?
mathematics
procedural-generation
random
API-Beast
quelle
quelle
Antworten:
Wenn Sie die gewünschte Verteilung kennen, können Sie die Ablehnungsstichprobe verwenden .
Einfachster Weg: Wählen Sie in der obigen Grafik zufällig Punkte aus, bis Sie feststellen, dass sich einer unterhalb der Kurve befindet. Dann benutze einfach die
x
-koordinate.Für die tatsächliche Verteilung gibt es verschiedene plausible Ansätze. Definieren Sie beispielsweise für die Planetennummer
i
am Standortp
und einige Stärkeparameterk
(z. B.0.5
) eine Funktionf_i(x)=abs(p-x)^k
und verwenden Sie dann die Verteilungsfunktiong(x)=f_1(x)*f_2(x)*...*f_n(x)
.In der Praxis berechnen und speichern Sie die Ergebnisse von
g(x)
to arrayt
(t[x]=g(x)
); Denken Sie auch an den höchsten gesehenen Werth
. Wählen Sie eine zufällige Positionx
int
, wählen Sie einen zufälligen Werty
zwischen0
undh
, wiederholen Sieif y>t[x]
; Andernfalls lautet der Rückgabewertx
.quelle
Ich bin nicht sicher, ob das Problem durch die Frage vollständig spezifiziert ist, aber ich kann einige einfache Ideen liefern. Die zweite davon liefert Zahlen, die in etwa dem entsprechen, was Ihr Bild anzeigt.
Wie Sie vielleicht feststellen, ändert sich die Verteilungsfunktion nach jeder generierten Zahl und verfügt über einen Speicher (dh sie ist nicht markovisch ). Jede dieser Methoden kann sich als unpraktisch erweisen, wenn der 'Speicher' (Anzahl der zuvor gezeichneten Zahlen) abgerufen wird sehr groß.
Einfach:
Generieren Sie Zufallszahlen aus einer flachen Verteilung, vergleichen Sie sie mit zuvor gezeichneten Zahlen und wiederholen Sie den Vorgang, wenn 'zu nah'.
Diese Antwort ähnelt eher Ihrer Zahl (vorausgesetzt, wir möchten aus 0..1 ziehen):
Endpunktfächer sind ein Sonderfall, aber es sollte einfach genug sein, damit Sie sehen können, wie Sie damit umgehen.
quelle
Denken Sie an den Unterschied zwischen 1 Würfel und 3 Würfel . 1 Würfel gibt Ihnen eine gleichmäßige Wahrscheinlichkeit für alle Werte, während 3 Würfel tendenziell eine höhere Wahrscheinlichkeit für die Werte in Richtung Mitte haben.
Je mehr "Würfel" in Ihrer Gleichung enthalten sind, desto größer ist Ihre Chance, etwas in Richtung Zentrum zu bringen. Definieren wir also eine Funktion, die jede Zahl gleichmäßig verarbeiten kann :
Jetzt können wir eine Beispielfunktion definieren, um dies zu verwenden:
Als erstes ist zu beachten, dass dieser Code wirklich nicht prüft, ob die Auswahl bereits mit einem der Punkte übereinstimmt. Wenn dies der Fall ist, wird einfach kein Punkt generiert, möglicherweise etwas, das Sie möchten.
Um zu erklären, was hier vor sich geht, generiert CenterRandom eine Art Glockenkurve. Diese Funktion unterteilt die Ebene in mehrere Glockenkurven, eine pro vorhandenem Punktepaar. Der Picker teilt uns mit, aus welcher Glockenkurve generiert werden soll. Da wir linear auswählen, können wir sicherstellen, dass Paare mit größeren Lücken häufiger ausgewählt werden, aber wir lassen es trotzdem völlig zufällig.
Hoffe das weist dich in die richtige Richtung.
quelle
Ich weiß, dass Sie nach einer Folge von zufälligen Positionen fragen , aber wenn Sie nicht darauf beschränkt sind, die Menge nacheinander zu generieren, gibt es einen anderen Ansatz: Generieren Sie eine Menge von Punkten mit dem gewünschten Abstand.
Was ich denke, dass Sie wollen, ist eine Reihe von Planeten, die einigermaßen zufällig verteilt sind. Anstelle der Erzeugung Planeten - Positionen mit einem Zufallszahlengenerator, erzeugen Planeten Abstand mit einem Zufallszahlengenerator. Auf diese Weise können Sie die Verteilung des Abstands direkt steuern, indem Sie einen Zufallszahlengenerator verwenden, der aus dieser Verteilung auswählt. Dies ist in 1 Dimension unkompliziert.
In zwei Dimensionen habe ich einige Ansätze gesehen, die „blaues Rauschen“ erzeugen, aber ich kenne keinen Weg, um Abstände mit einer beliebigen Verteilung zu erzeugen. In diesem Artikel wird der Standardansatz "Versuchen Sie es zu platzieren und abzulehnen, wenn es zu nahe ist" behandelt. Sie können jedoch alle auf einmal mit einer "weicheren" Lösung generieren, indem Sie alle Ihre Punkte platzieren und dann mit Lloyd Relaxation alle Planeten auf mehr verschieben wünschenswerte Positionen. Es wird die zu nahen Planeten weiter auseinander bewegen. Rekursive Wang-Kacheln sind ein weiterer Ansatz, der nützlich sein könnte. Dieses Papiererweitert das Problem auf die Erzeugung von Planeten mit einer Dichte und einem anderen Objekt wie Asteroiden mit einer anderen Dichte. Möglicherweise können Sie auch mithilfe der Fourier-Reihe blaues Rauschen erzeugen. Ich bin mir nicht sicher. Mit dem Fourier-Reihen-Ansatz können Sie auch beliebige Verteilungen anstelle von nur blauem Rauschen verwenden.
quelle