2009-06-17 10 views
6

Ich schreibe im Moment einen Vertexshader, und ich brauche einige Zufallszahlen. Vertex-Shader-Hardware hat keine logischen/Bit-Operationen, daher kann ich keinen der Standard-Zufallsgeneratoren implementieren. Ist es möglich, einen Zufallszahlengenerator nur mit Standardarithmetik zu erstellen? die Zufälligkeit muss nicht besonders gut sein!Zufallsgenerierung ohne Verwendung von Bitoperationen

Antwort

5

Wenn Sie nicht beschissen Zufälligkeit dagegen, eine klassische Methode ist

x[n+1] = (x[n] * x[n] + C) mod N 

wobei C und N Konstanten sind, C! = 0 und C! = -2 und N ist eine Primzahl. Dies ist ein typischer Pseudozufallsgenerator für Pollard Rho Factoring. Versuchen Sie C = 1 und N = 8051, die funktionieren ok.

+0

das scheint zufällig genug zu sein, danke! – Martin

+0

Sicher. Sie benötigen keine große statistische Qualität für Grafiken. –

2

Vertex Shader haben manchmal integrierte Rauschgeneratoren für Sie zu verwenden, wie zum Beispiel cgs noise() Funktion.

+0

HLSL hat eine Rauschfunktion haben, die ich verwenden könnte: http://msdn.microsoft.com/en-us/library/bb509629(VS.85).aspx Allerdings, wenn ich es in der Vergangenheit ist es verwendet haben hat nie funktioniert, in der Tat bis vor kurzem, ich glaube, es wurde als "noch nicht implementiert" markiert! – Martin

2

Verwenden Sie ein linear congruential generator:

X_(n+1) = (a * X_n + c) mod m 

Das sind nicht so stark, aber zumindest sind sie gut bekannt und lange Perioden haben. Die Wikipedia-Seite hat auch gute Empfehlungen:

Die Periode einer allgemeinen LCG ist höchstens m, und für einige Entscheidungen eines viel weniger als das. Die LCG eine volle Zeit haben, wenn und nur wenn:

1. c and m are relatively prime, 
2. a - 1 is divisible by all prime factors of m, 
3. a - 1 is a multiple of 4 if m is a multiple of 4 
2

Ob Sie es glauben oder nicht, habe ich NEWX = oldx * 5 + 1 (oder eine leichte Variation davon) in mehreren Videospielen. Die Zufälligkeit ist schrecklich - es ist eher eine verschlüsselte Sequenz als ein Zufallsgenerator. Aber manchmal ist das alles, was Sie brauchen. Wenn ich mich richtig erinnere, durchläuft es alle Zahlen, bevor es wiederholt wird.

Es hat einige schreckliche Eigenschaften. Es gibt Ihnen niemals die gleiche Nummer zweimal hintereinander. Ein paar von uns machten eine Reihe von Tests auf Variationen davon und wir verwendeten einige Variationen in anderen Spielen.

Wir haben es benutzt, als uns kein Modulo zur Verfügung stand. Es ist nur eine Verschiebung um zwei und zwei Additionen (oder eine Multiplikation mit 5 und eine Addition). Ich würde es heute nie für Zufallszahlen verwenden - ich würde eine LCG verwenden - aber vielleicht würde es OK für einen Shader funktionieren, bei dem Geschwindigkeit entscheidend ist und Ihr Befehlssatz möglicherweise begrenzt ist.

+0

hehe, das ist ein interessanter RNG, der mathematisch leicht verständlich ist, den ich gesehen habe! Ich werde damit spielen, denn wie du sagst ist Geschwindigkeit entscheidend. – Martin

Verwandte Themen