[SQL Server] Zufallszahlen erzeugen

Thomas Darimont

Erfahrenes Mitglied
Hallo,

hier mal ein Beispiel wie man unter SQL Server Zufallszahlen erzeugen kann.

Die Funktion RAND() liefert auch Zufallswerte jedoch werden diese bei der Verwendung in einem Select Statement nur einmal erzeugt, sprich für das Ergebnis des Statements gilt dann für jede Zeile die geleiche zufällige Zahl... das ist nicht immer das was man möchte ;-)

Deshalb hier ein paar andere Möglichkeiten zur Generierung von Zufallszahlen in SQL Server:

(Für das Beispiel verwende ich der Einfachheit wegen eine temporäre Tabelle...)

SQL:
DECLARE @RandomTest TABLE (ID int) --Temporäre Tabelle
INSERT INTO @Randomtest values (1),(2),(3),(4)
select * from @RandomTest;

select RAND() as RandomNumber, * from @RandomTest;

--Zufällige positive Ganzzahlen
select ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS RandomNumber, * from @RandomTest

--Werte zwischen 0..1
select convert(float,CAST(CAST(newid() AS binary(4)) AS int))/2147483648.0/2+.5 AS RandomNumber, * from @RandomTest



Quellen:
http://ms-olap.blogspot.com/2010/10/do-you-trust-your-data-mining-results.html
http://www.sql-server-helper.com/tips/generate-random-numbers.aspx

Gruß Tom
 

Anhänge

  • randomNumbersSqlServer.PNG
    randomNumbersSqlServer.PNG
    10 KB · Aufrufe: 107
Hallo,

besteht auch die Möglichkeit mit deiner Lösung reproduzierbare Zufallszahlen zu erzeugen?!

Ich möchte also für jede Zeile ein andere Zufallszahl haben, diese sollten aber bei jeder Abfrage die gleiche sein.
(Analog zum setzten des seeds in der rand() Funktion)

Vielen Dank
 
man könnte die id als seed für die rand-Funktion verwenden:

SQL:
DECLARE @RandomTest TABLE (ID INT) --Temporäre Tabelle
INSERT INTO @Randomtest VALUES (1),(2),(3),(4)
SELECT * FROM @RandomTest;
 
SELECT RAND(id * 4711) AS RandomNumber, * FROM @RandomTest;

Code:
RandomNumber	ID
0,801353287839046	1
0,889133215436426	2
0,976913143033806	3
0,0646930834216355	4

Ohne die Multiplikation der id liegen die Werte sehr dicht beieinander, deshalb habe ich die 4711 eingesetzt.

Gruß

Martin
 
Zuletzt bearbeitet:
Zurück