Câu trả lời:
Nếu theo các số từ 1 đến 10, bạn có nghĩa là bất kỳ số float nào> = 1 và <10, thì thật dễ dàng:
select random() * 9 + 1
Điều này có thể dễ dàng kiểm tra với:
# select min(i), max(i) from (
select random() * 9 + 1 as i from generate_series(1,1000000)
) q;
min | max
-----------------+------------------
1.0000083274208 | 9.99999571684748
(1 row)
Nếu bạn muốn các số nguyên> = 1 và <10, thì thật đơn giản:
select trunc(random() * 9 + 1)
Và một lần nữa, thử nghiệm đơn giản:
# select min(i), max(i) from (
select trunc(random() * 9 + 1) as i from generate_series(1,1000000)
) q;
min | max
-----+-----
1 | 9
(1 row)
trunc()
trả về cùng kiểu dữ liệu với đầu vào (như đã nêu trong sách hướng dẫn). Bạn cần phải đúc kết quả đến một số nguyên:trunc(random() * 20)::int
random()
trả về giá trị <1 mà khi nhân với 9 sẽ là> = 9 do bản chất không chính xác của kiểu chính xác kép không? Trong thực tế, ngay cả khi điều đó có thể xảy ra, tất nhiên sẽ không thể biến mất vì độ chính xác của 15 chữ số.
Để tóm tắt và đơn giản hóa một chút, bạn có thể sử dụng:
-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
Và bạn có thể kiểm tra điều này như được đề cập bởi @ user80168
-- 0 - 9
SELECT min(i), max(i) FROM (SELECT floor(random() * 10) AS i FROM generate_series(0, 100000)) q;
-- 0 - 10
SELECT min(i), max(i) FROM (SELECT floor(random() * (10 + 1)) AS i FROM generate_series(0, 100000)) q;
-- 1 - 10
SELECT min(i), max(i) FROM (SELECT ceil(random() * 10) AS i FROM generate_series(0, 100000)) q;
ceil(random() * 10)
dẫn đến kết quả là 0 - tôi sẽ kiên định floor
.
SELECT floor(random() * 10 + 1);
Nếu bạn đang sử dụng SQL Server thì cách chính xác để lấy số nguyên là
SELECT Cast(RAND()*(b-a)+a as int);
Ở đâu
(trunc (ngẫu nhiên () * 10)% 10) + 1
Phiên bản chính xác của câu trả lời của hythlodayr.
-- ERROR: operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
Đầu ra từ trunc
phải được chuyển đổi thành INTEGER
. Nhưng nó có thể được thực hiện mà không cần trunc
. Vì vậy, nó hóa ra là đơn giản.
select (random() * 9)::INTEGER + 1
Tạo đầu ra INTEGER trong phạm vi [1, 10] tức là bao gồm cả 1 và 10.
Đối với bất kỳ số nào (số nổi), hãy xem câu trả lời của user80168. tức là chỉ cần không chuyển đổi nó thành INTEGER
.
Thực sự tôi không biết bạn muốn điều này.
thử cái này
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
Thủ tục được lưu trữ này sẽ chèn một số rand vào một bảng. Nhìn ra, nó chèn một số vô tận. Ngừng thực hiện nó khi bạn nhận đủ số.
tạo bảng cho con trỏ:
CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL)
ĐI
Tạo một bảng để chứa các số của bạn:
CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)
CHÈN KHẮC PHỤC:
INSERT INTO [SearchIndex]([Cursor]) SELECT N'INSERT INTO ID SELECT FLOOR(rand() * 9 + 1) SELECT COUNT (ID) FROM ID
TẠO VÀ THỰC HIỆN QUY TRÌNH:
CREATE PROCEDURE [dbo].[RandNumbers] AS
BEGIN
Declare CURSE CURSOR FOR (SELECT [Cursor] FROM [dbo].[SearchIndex] WHERE [Cursor] IS NOT NULL)
DECLARE @RandNoSscript NVARCHAR (250)
OPEN CURSE
FETCH NEXT FROM CURSE
INTO @RandNoSscript
WHILE @@FETCH_STATUS IS NOT NULL
BEGIN
Print @RandNoSscript
EXEC SP_EXECUTESQL @RandNoSscript;
END
END
GO
Điền vào bảng của bạn:
EXEC RandNumbers