5 Stimmen

Gefütterter 3D-Zufallsgenerator für weißes Rauschen mit Zufallszugriff

Ich habe so gut wie keine Erfahrung mit Zufallsgeneratoren. Ich habe die Standard-Rand-Funktionen in C verwendet und ich habe Perlin-Rauschen verwendet.

Aber jetzt brauche ich einen Würfel mit der Auflösung NxNxN (mit N vielleicht 1e6 oder größer), der mit weißem Rauschen gefüllt ist (keine Perlin-Glättung oder so), in dem ich einfach einen Wert "auswählen" kann, und wenn ich denselben Wert erneut auswähle, sollte das Ergebnis jedes Mal dasselbe sein. Es sollte ein Seeded sein, d.h. wenn ich die Anwendung erneut starte, müssen die Ergebnisse die gleichen sein. Es sollte nicht sicher oder so sein, nur zufällig genug, damit ein Mensch nicht in der Lage ist, Werte durch bloßes Nachdenken vorherzusagen. Wenn er es wirklich mit einem Computer analysiert, ist es in Ordnung, dass es vorhersehbar ist.

Es ist, als würde ich die Standard-C-Rand-Funktion verwenden, den Seed setzen und eine verschachtelte for-Schleife für die 3 Dimensionen machen und jedes Mal eine Zufallszahl erzeugen, bis ich die Koordinate erreiche. Das ist natürlich furchtbar langsam. Ich brauche etwas, das schnell ist!

Ich habe das Internet durchsucht und viel und gleichzeitig nichts gefunden. Vielleicht suche ich nach den falschen Stichworten, aber ich habe nichts gefunden, was ich verwenden kann.

Kann mir jemand bei den ersten Schritten helfen? Ein Code? Ein Link? Es ist mir egal, ob ich die Algorithmen verstehe, aber es sollte einfach zu implementieren und zu benutzen sein und vor allem schnell sein.

0voto

scippie Punkte 1874

Da niemand in der Lage zu sein scheint, die Frage zu beantworten, habe ich nachgeforscht und habe das Problem mit der folgenden Lösung gelöst:

int pseudoRandom(int &seed)
{
    const int a = 16807; // 7^5
    const int m = 2147483647; // 2^31 - 1
    seed = int(unsigned(seed * a) % m);
    return seed;
}

Ich nehme die obige, wohlbekannte Zufallsfunktion. Es ist eine gute Funktion, da sie leicht in eine Shader-Sprache konvertiert werden kann und leicht auf 64-Bit-Ints oder etwas anderes erweitert werden kann.

Nun muss ich in der Lage sein, Randoms zwischen 0,0 und ?.? auf 3 Dimensionen zu erstellen, und sie sollten immer das gleiche Ergebnis mit der gleichen Basis-Saatgut haben, so nahm ich den ganzzahligen Teil jeder Komponente x, y und z, und eine Basis-Saatgut.

int seed = baseseed;
pseudoRandom(seed);
pseudoRandom(seed * (int(x) + seed) * (int(y) + seed) * (int(z) + seed);

\=> Das Saatgut ist jetzt auf einem Wert, bei dem ich mit der Erstellung eines detaillierten Zufallsrasters beginnen kann. Wenn ich also ein Detail von 32x32x32 Zufallswerten benötige, generiere ich es einfach hier in einem Array. Hätte ich ein größeres Array benötigt, hätte ich denselben Schritt wiederholen können, um eine weitere Ebene zu erzeugen:

pseudoRandom(seed * (int(x * 100) + seed) * (int(y * 100) + seed) * (int(z * 100) + seed);

Auf diese Weise sind Sie ziemlich frei in der Gestaltung der Zufallszahlen und haben die volle Kontrolle über die Details.

Damit war mein Problem gelöst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X