Freigeben über


Verwenden von RAND

Die RAND-Funktion berechnet eine zufällige Gleitkommazahl von 0 bis 1 und kann optional einen tinyint-, int- oder smallint-Wert als Startwert des zu berechnenden zufälligen Wertes als Eingabe verwenden.

Im folgenden Beispiel werden zwei zufällige Zahlen berechnet. Die erste RAND()-Funktion überlässt SQL Server die Auswahl des Ausgangswertes, während die zweite RAND()-Funktion den Wert 3 als Startwert verwendet.

SELECT RAND(), RAND(3);

Die RAND-Funktion ist ein numerischer Pseudozufallszahlen-Generator, der ähnlich wie die rand-Funktion der C-Laufzeitbibliothek arbeitet. Falls kein Ausgangswert angegeben wird, generiert das System seine eigenen variablen Ausgangswerte. Wenn Sie RAND mit einem Ausgangswert aufrufen, müssen Sie selbst variable Ausgangswerte verwenden, um zufällige Zahlen zu generieren. Wenn Sie RAND mehrmals mit dem gleichen Ausgangswert aufrufen, wird der gleiche generierte Wert zurückgegeben. Das folgende Skript gibt den gleichen Wert für alle Aufrufe an RAND zurück, da die Aufrufe alle den gleichen Ausgangswert verwenden:

SELECT RAND(159784);
SELECT RAND(159784);
SELECT RAND(159784);

Eine gebräuchliche Methode zum Generieren von zufälligen Zahlen mit RAND besteht darin, einen relativ variablen Wert als Ausgangswert einzubeziehen, wie z. B. durch Hinzufügen von mehreren Teilen einer GETDATE-Funktion:

SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
           + (DATEPART(ss, GETDATE()) * 1000 )
           + DATEPART(ms, GETDATE()) );

Bei Verwendung eines auf GETDATE basierenden Algorithmus zum Generieren von Ausgangswerten kann RAND jedoch weiterhin doppelte Werte generieren, wenn die Aufrufe an RAND innerhalb des Intervalls der kleinsten Datumseinheit ausgeführt werden, die in dem Algorithmus verwendet wird. Dies ist insbesondere dann wahrscheinlich, wenn die Aufrufe an RAND in einem einzigen Batch enthalten sind. Mehrere Aufrufe an RAND in einem einzigen Batch können innerhalb derselben Millisekunde ausgeführt werden. Dies ist die kleinste Schrittweite von DATEPART. In diesem Fall sollten Sie einen Wert einfügen, der nicht auf der Zeit basiert, um die Ausgangswerte zu generieren.