# [SQL Server] Zufallszahlen erzeugen



## Thomas Darimont (6. Januar 2011)

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...)


```
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


----------



## Tebeadni (13. Februar 2014)

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


----------



## MPr (13. Februar 2014)

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


```
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;
```


```
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


----------

