เนื่องจากแนวทางของฉันสำหรับคำถามทดสอบที่ฉันใช้ในคำถามนี้ไม่ได้ผลฉันจึงพยายามอย่างอื่นในตอนนี้ มีวิธีบอกrandom()
ฟังก์ชันของ pg เพื่อให้ฉันได้แค่ตัวเลขระหว่าง 1 ถึง 10 หรือไม่?
เนื่องจากแนวทางของฉันสำหรับคำถามทดสอบที่ฉันใช้ในคำถามนี้ไม่ได้ผลฉันจึงพยายามอย่างอื่นในตอนนี้ มีวิธีบอกrandom()
ฟังก์ชันของ pg เพื่อให้ฉันได้แค่ตัวเลขระหว่าง 1 ถึง 10 หรือไม่?
คำตอบ:
ถ้าตามตัวเลขระหว่าง 1 ถึง 10 คุณหมายถึงลอยใด ๆ ที่เป็น> = 1 และ <10 มันก็ง่ายมาก:
select random() * 9 + 1
สามารถทดสอบได้อย่างง่ายดายด้วย:
# 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)
หากคุณต้องการจำนวนเต็มนั่นคือ> = 1 และ <10 ก็ทำได้ง่ายๆ:
select trunc(random() * 9 + 1)
และอีกครั้งการทดสอบง่ายๆ:
# 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()
ส่งคืนข้อมูลประเภทเดียวกันกับอินพุต (ตามที่ระบุไว้ในคู่มือ) คุณต้องส่งผลลัพธ์เป็นจำนวนเต็ม:trunc(random() * 20)::int
random()
จะคืนค่า <1 ซึ่งเมื่อคูณด้วย 9 จะเป็น> = 9 เนื่องจากลักษณะที่ไม่แน่นอนของประเภทความแม่นยำสองเท่า ? ในทางปฏิบัติแม้ว่าจะเป็นไปได้ แต่ก็ไม่น่าจะหายไปอย่างแน่นอนเพราะตัวเลข 15 หลักหรือมากกว่านั้น
เพื่อสรุปและทำให้ง่ายขึ้นเล็กน้อยคุณสามารถใช้:
-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
และคุณสามารถทดสอบสิ่งนี้ได้โดย @ 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)
ผลใน 0 - floor
ฉันจะติด
SELECT floor(random() * 10 + 1);
หากคุณใช้ SQL Server วิธีที่ถูกต้องในการรับจำนวนเต็มคือ
SELECT Cast(RAND()*(b-a)+a as int);
ที่ไหน
(trunc (สุ่ม () * 10)% 10) + 1
คำตอบของ hythlodayr รุ่นที่ถูกต้อง
-- ERROR: operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
เอาท์พุทจากจะต้องมีการแปลงเป็นtrunc
แต่ก็สามารถทำได้โดยไม่ต้องINTEGER
trunc
ดังนั้นมันจึงกลายเป็นเรื่องง่าย
select (random() * 9)::INTEGER + 1
สร้างเอาต์พุต INTEGER ในช่วง [1, 10] เช่นทั้ง 1 และ 10 รวม
สำหรับตัวเลขใด ๆ (ลอยตัว) โปรดดูคำตอบของ user80168 เช่นอย่าแปลงเป็นไฟล์INTEGER
.
อันที่จริงฉันไม่รู้ว่าคุณต้องการสิ่งนี้
ลองดู
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
กระบวนงานที่เก็บไว้นี้จะแทรกตัวเลขแรนด์ลงในตาราง มองออกไปมันแทรกตัวเลขที่ไม่มีที่สิ้นสุด หยุดดำเนินการเมื่อคุณมีจำนวนเพียงพอ
สร้างตารางสำหรับเคอร์เซอร์:
CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL)
ไป
สร้างตารางเพื่อใส่หมายเลขของคุณ:
CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)
การใส่สคริปต์:
INSERT INTO [SearchIndex]([Cursor]) SELECT N'INSERT INTO ID SELECT FLOOR(rand() * 9 + 1) SELECT COUNT (ID) FROM ID
การสร้างและดำเนินการตามขั้นตอน:
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
กรอกตารางของคุณ:
EXEC RandNumbers