Ich arbeite an einem Side-Scrolling-Spiel und möchte einen Wald für den Hintergrund generieren. Ich möchte, dass der Hintergrund für alle gleich ist, um sicherzustellen, dass die Qualität gleich ist. Ich habe auch keinen Zugriff auf einen gesetzten Zufallszahlengenerator, daher kann ich keinen guten Startwert finden und von dort aus fortfahren.
Ideen?
Antworten:
Der naheliegendste Weg wäre wahrscheinlich, einen eigenen Zufallszahlengenerator zu schreiben. Vor allem, weil Sie keine besonders hohen Standards für Zufälligkeit erfüllen müssen (nur das Fehlen offensichtlich sichtbarer Muster), ist es ziemlich einfach, ein ziemlich vernünftiges in weniger als einem halben Dutzend Codezeilen zu schreiben.
Sie können ein Argument hinzufügen, mit dem die Objektdichte gleich bleibt, um sie bei Bedarf zu verbessern
quelle
Versuche dies. Iterieren Sie von Nummer 1 bis n, wobei n die Anzahl der Bäume ist, die Sie zeichnen möchten. Berechnen Sie für jede Zahl einen Hash. Verwenden Sie den Hash als Eingabe für die Funktion, mit der die Elemente im Hintergrund gezeichnet oder positioniert werden. Zum Beispiel könnten Sie die ersten 8 Bits eines 128-Bit-MD5-Hash als x-Prozentsatz, das nächste als y-Prozentsatz, das nächste als eine Art x-Skalierung usw. verwenden. Wenn Sie dieselbe Hash-Funktion verwenden, geben Sie an Die gleichen Eingaben, jedes Mal, wenn Sie es ausführen, erhalten Sie die gleiche Ausgabe.
Dies sollte absolut sowohl eine gute Zufälligkeit ergeben als auch deterministisch sein.
Wenn dies keine gute Antwort ist, hinterlassen Sie bitte einen Kommentar, in dem erläutert wird, warum.
Wenn man sich nur Wikipedia ansieht, sieht diese Methode vielversprechend aus:
http://en.wikipedia.org/wiki/Random_number_generation#Computational_methods
quelle
Wenn Sie Zugriff auf eine beliebige Art von Hash (wie MD5) oder Prüfsumme (wie CRC32) haben, können Sie einfach eine Folge von Zahlen hashen.
Andernfalls wäre das einfachste PRNG wahrscheinlich der lineare Kongruenzgenerator . Es hat einen kompliziert klingenden Namen, aber einen zu schreiben ist extrem einfach:
Wählen Sie drei Konstanten, m , a und c .
Beginnen Sie, indem Sie x prev auf Ihren Samen setzen.
Dann tun Sie jedes Mal, wenn Sie als nächstes einen neuen Wert x generieren möchten , einfach
Einige gute Optionen für m , a und c finden Sie hier .
quelle
Da eine generierte gesetzte Zufallszahl im Wesentlichen nur eine Nachschlagetabelle ist, wobei der Startwert der Versatz (Startindex) ist, können Sie eine einfache einrichten, indem Sie eine CSV-Datei (Comma Separated Values) mit Zahlen einlesen.
Solange alle Instanzen denselben Startwert verwenden, ist er deterministisch, während die Pseudozufälligkeit beibehalten wird.
quelle
Sie können das Zikadenprinzip anwenden (verwenden Sie Primzahlen für Intervalle).
quelle
Eine Möglichkeit besteht darin, einen Algorithmus namens Simplex Noise zu verwenden , der von Ken Perlin (bekannt für Perlin Noise) erfunden wurde. Ein nettes Merkmal von Simplex-Rauschen (wie Perlin-Rauschen) ist, dass es gekachelt werden kann - dh, es muss nur ein kleiner Bereich außerhalb des potenziellen Bereichs berechnet werden, und dies kann über den gesamten Bereich ohne sichtbare Nähte wiederholt werden.
Simplex-Rauschen kann schneller als Perlin-Rauschen erzeugt werden und erfordert keinen Zufallszahlengenerator. Es ist nicht willkürlich, nur durch Kenntnis der Theorie zu implementieren, aber es gibt einen Quellcode , der Ihnen weiterhilft ( siehe Wikipedia ).
Andere Optionen zum Erzeugen von pseudozufälligem Rauschen sind Fraktale und Wavelets .
In Ihrer Situation würden Sie eine dieser Techniken verwenden, um eine Reihe von Daten in einer Dimension zu generieren, und dann einen Schwellenwert anwenden, um zu bestimmen, ob ein Baum an dieser Position platziert werden soll.
quelle
Einfachste Antwort: Lassen Sie Ihr Programm eine Datei mit vorgenerierten Zahlen laden und schreiben Sie ein einfaches Dienstprogramm, um zufällige (oder auf jeden Fall algorithmische) Zahlen zu generieren, die in dieser Datei gespeichert werden sollen.
Auf diese Weise können Sie Dateien generieren, die größtenteils gut sind, und die verbleibenden Teile davon, die saugen, von Hand optimieren, ohne auf das Problem einzugehen, bei dem jeder zufällige Startwert, den Sie versuchen, ein Problem damit hat.
quelle
Ein anderer Ansatz:
Verwenden Sie eine Blockverschlüsselung, um eine Reihe von Zahlen von 1 bis N mit einem festen Schlüssel zu "verschlüsseln". TEA ist einfach zu implementieren und ziemlich schnell.
Ein Vorteil dieses Ansatzes besteht darin, dass Sie, wenn Sie die Reihe von "Zufallszahlen", die Sie zurückerhalten, nicht mögen, einen anderen Verschlüsselungsschlüssel ausprobieren und eine ganz andere Reihe zurückerhalten können.
quelle