Ich bin auf der Suche nach einem Pseudozufallszahlengenerator, der darauf spezialisiert sein würde, schnell zu arbeiten, wenn ihm vor dem Erzeugen jeder Zahl ein Startwert gegeben wird. Die meisten Generatoren, die ich bis jetzt gesehen habe, gehen davon aus, dass Sie den Startwert einmal setzen und dann eine lange Folge von Zahlen erzeugen. Das einzige, was etwas ähnlich sieht, was ich bisher gesehen habe, ist Perlin Noise, aber es erzeugt zu "glatte" Daten - für ähnliche Eingaben neigt es dazu, ähnliche Ergebnisse zu erzeugen.Schneller Pseudozufallszahlengenerator für prozeduralen Inhalt
Die Erklärung des Generators sollte wie etwas aussehen:
int RandomNumber1(int seed);
Oder:
int RandomNumber3(int seedX, int seedY, int seedZ);
Ich denke, die gute RandomNumber1 genug sein sollte, wie es möglich ist, RandomNumber3 zu implementieren durch seine Eingänge Hashing und das Ergebnis in die RandomNumber1 übergeben, aber ich schrieb den zweiten Prototyp für den Fall, dass eine Implementierung die unabhängigen Eingaben verwenden könnte.
Die beabsichtigte Verwendung dieses Generators besteht darin, ihn für den prozeduralen Inhaltsgenerator zu verwenden, z. B. das Erzeugen einer Gesamtstruktur durch Platzieren von Bäumen in einem Gitter und das Bestimmen einer zufälligen Baumart und zufälligen räumlichen Offsets für jede Position.
Der Generator muss sehr effizient sein (unter 500 CPU-Zyklen), da der prozedurale Inhalt während des Renderings in großen Mengen in Echtzeit erstellt wird.
Der Grund Perlin Geräusch ähnelt, was Sie fragen, ist, dass Perlin Geräusch eine deterministische (wiederholbare) Pseudo-Zufalls-Funktion verwendet einen Teil seiner Arbeit (und dann glättet das Ergebnis) zu tun. Wenn Sie sich eine Perlin-Noise-Implementierung ansehen, insbesondere die früheren "verbesserten", finden Sie häufig den Typ der effizienten, wiederholbaren "zufälligen" Funktion, nach der Sie suchen, obwohl die Sprache, die Domain und der Bereich variieren. Z.B. 'RandomNumber (vec2-Startwert, Gleitkommazahl x, Gleitkommawert y) {return fract (sin (Punkt (Startwert + vec2 (fx, fy), vec2 (12.9898,78.233))) * 43758.5453); } '(GLSL ES) – LarsH
Ich habe versucht, auch diese Frage zu erforschen, und bin zu dem Schluss gekommen, dass das Wort" Generator "das sequentielle Streaming-Verhalten impliziert, das wir zu vermeiden versuchen. Aus diesem Grund versteht man unter PRN ** G ** in der Regel statusbehaftete "Funktionen", nicht streng deterministische. Vielleicht hätten wir besseren Erfolg in der Forschung, wenn wir PRNF (Funktion) statt PRNG suchten. https://blogs.unity3d.com/2015/01/07/a-primer-on-repeatable-random-numbers/ nennt sie "zufällige Hash-Funktionen". – LarsH