Zufällig aussehende Artikelplatzierung, die deterministisch ist?

7

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?


quelle
7
Warum haben Sie keinen Zugriff auf einen gesetzten Zufallszahlengenerator?
Es ist ein Spielemacher-ähnliches Programm und es hat keines :(
4
Welcher Spielehersteller bietet keinen gesetzten Zufallszahlengenerator an? Seltsam.
7
Wenn Sie es mit der von Ihnen verwendeten Engine kennzeichnen, können wir die Antworten genauer beschreiben.
Martin Sojka

Antworten:

15

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

Jerry Sarg
quelle
3
Dieser Algorithmus erzeugt Zufallszahlen von sehr guter Qualität (wie bei " kryptografischen" guten) Sätzen (und verwendet sogar 0, da Ihr Startwert ihn nicht bricht) - er wurde in viele verschiedene Sprachen portiert (Quelle eingeschlossen) und ist schnell : burtleburtle.net/bob/rand/isaacafa.html
Randolf Richardson
6

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
Ich bin nicht derjenige, der es abstimmt, nur um es noch herauszufinden :)
Vielen Dank. Nur ein wenig frustriert, wie schwer es ist, 50 Punkte zu verdienen, damit ich Kommentare
Dies ist ein ziemlich hoher Overhead (Berechnung einer sicheren Hash-Funktion für jedes Element) für etwas, das mit einem PRNG gut funktionieren würde. (Ich stimme dich nicht ab, sondern erkläre nur, warum ich nicht denke, dass es die beste Lösung ist.)
Einverstanden. Vielleicht könnte es effizienter gemacht werden, einen schnellen, aber schlechten Hashing-Algorithmus zu verwenden und ihn als Bitstrom zu implementieren, um keinen zu verschwenden?
5

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

x next = (a * x prev + c) mod m  
x prev = x next

Einige gute Optionen für m , a und c finden Sie hier .

BlueRaja - Danny Pflughoeft
quelle
3

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.

Jordaan Mylonas
quelle
3

Sie können das Zikadenprinzip anwenden (verwenden Sie Primzahlen für Intervalle).

Ricardo Tomasi
quelle
2

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.

Damit die Rauschfunktion wiederholbar ist, dh immer den gleichen Wert für einen bestimmten Eingabepunkt ergibt, müssen Gradienten pseudozufällig und nicht wirklich zufällig sein. Sie müssen genügend Variationen aufweisen, um die Tatsache zu verbergen, dass die Funktion nicht wirklich zufällig ist, aber zu viele Variationen führen zu einem unvorhersehbaren Verhalten der Rauschfunktion

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.

Luke Van In
quelle
1

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.

Patrick Hughes
quelle
Ich denke, dass dies in Verbindung mit einem der Ansätze, die als Antwort für die Generierung der Zahlen angegeben werden, für Sie am einfachsten in der von Ihnen verwendeten Standard-Engine zu implementieren sein wird.
technomalogical
0

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.

Alex D.
quelle