Liczba losowa

Czasami potrzebna użyć liczby losowej w naszych poleceniach do bazy. Dziś omówię kilka podstawowych poleceń generujących takie liczby.

Podstawowe polecenie to

select rand() as liczba_losowa

liczba_losowa
----------------------
0,728291256646099

(1 row(s) affected)

Chcąc wygenerować liczbę w zakresie od 1-100 należy skorzystać z funkcji ROUND

select ROUND(rand()*100,0) as liczba_losowa_100

liczba_losowa_100
----------------------
72

(1 row(s) affected)

Teraz bardziej skomplikowane 🙂

---- deklarujemy trzy zmienne
DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT

---- polecenie wygeneruje nam liczbę z zakresu 1 - 999
SET @Lower = 1 ---- Minimalna liczba losowa
SET @Upper = 999 ---- maksymalna liczba losowa

---- generowanie liczby losowej
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random as losowa

losowa
-----------
553

(1 row(s) affected)

Przykład wygeneruje liczbę losową typu FLOAT

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

float_losowa
----------------------
0,711247999515049

(1 row(s) affected)

Tu mamy przykład jak wygenerować 1000 liczb losowych

SELECT randomNumber, COUNT(1) countOfRandomNumber
FROM (
SELECT ABS(CAST(NEWID() AS binary(6)) %1000) + 1 randomNumber
FROM sysobjects) sample
GROUP BY randomNumber
ORDER BY randomNumber

randomNumber countOfRandomNumber
------------ -------------------
1            3
2            1
3            2
...
998          3
999          1
1000         5

(890 row(s) affected)

A tu generowanie liczby losowej typu FLOAT z zakresu 0 – 20 [0, 20)

SELECT 20*RAND() as random_float

random_float
----------------------
13,5931559352411

(1 row(s) affected)

Liczba losowa FLOAT z zakresu 10 – 30 [10, 30)

SELECT 10 + (30-10)*RAND() as random_float

random_float
----------------------
10,0639569987873

(1 row(s) affected)

Losowa liczba INTEGER z zakresu 0 – 20 [0, 20]

SELECT CONVERT(INT, (20+1)*RAND()) as random_float

random_float
-----------
19

(1 row(s) affected)

Liczba losowa INTEGER z zakresu 10 – 30 [10, 30]

SELECT 10 + CONVERT(INT, (30-10+1)*RAND()) as random_float

random_float
-----------
17

(1 row(s) affected)

A to już wygenerowanie liczb losowych i zapisanie ich do tabeli tymczasowej @T

DECLARE @t TABLE( randnum float )
DECLARE @cnt INT; SET @cnt = 0
WHILE @cnt <=10000
BEGIN
SET @cnt = @cnt + 1
INSERT INTO @t
SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) )
END

SELECT randnum, COUNT(*) as count
FROM @t
GROUP BY randnum

wynik:

randnum                count
---------------------- -----------
0,382376056807819      173
0,382450588692852      141
0,385860422433103      105
...
0,402387867939126      76
0,402443766852901      131
0,402499665766675      16

(110 row(s) affected)

Opierając się na tym samym poleceniu możemy wykonać wpis np 1000 losowych liczb do tabeli

SELECT 20*RAND()

CREATE TABLE [dbo].[TestTable]( [losowa] [float] NULL) ON [PRIMARY]

INSERT INTO [dbo].[TestTable] ([losowa]) VALUES (20*RAND())

SELECT TOP 1000 [losowa] FROM [TESTOWA].[dbo].[TestTable]

DECLARE @cnt INT; SET @cnt = 0
WHILE @cnt <=100000
BEGIN
SET @cnt = @cnt + 1
INSERT INTO [dbo].[TestTable] ([losowa]) VALUES (20*RAND())
END

SELECT TOP 100 [losowa] FROM [TESTOWA].[dbo].[TestTable]

Ten wpis został opublikowany w kategorii TSQL i oznaczony tagami . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz