สร้างตัวเลขสุ่มในช่วง 1 - 10


99

เนื่องจากแนวทางของฉันสำหรับคำถามทดสอบที่ฉันใช้ในคำถามนี้ไม่ได้ผลฉันจึงพยายามอย่างอื่นในตอนนี้ มีวิธีบอกrandom()ฟังก์ชันของ pg เพื่อให้ฉันได้แค่ตัวเลขระหว่าง 1 ถึง 10 หรือไม่?

คำตอบ:


160

ถ้าตามตัวเลขระหว่าง 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)

เลือกวันที่ (e.created_at) + (trunc (สุ่ม () * 20)) จากเหตุการณ์ e; ผลลัพธ์ใน: ERROR: ไม่มีตัวดำเนินการ: date + double precision trunc คืนค่าจำนวนเต็มจริงหรือ?
Bogdan Gusiev

3
trunc()ส่งคืนข้อมูลประเภทเดียวกันกับอินพุต (ตามที่ระบุไว้ในคู่มือ) คุณต้องส่งผลลัพธ์เป็นจำนวนเต็ม:trunc(random() * 20)::int
a_horse_with_no_name

ฉันสงสัยว่าอย่างน้อยในทางทฤษฎีเป็นไปได้ไหมที่random()จะคืนค่า <1 ซึ่งเมื่อคูณด้วย 9 จะเป็น> = 9 เนื่องจากลักษณะที่ไม่แน่นอนของประเภทความแม่นยำสองเท่า ? ในทางปฏิบัติแม้ว่าจะเป็นไปได้ แต่ก็ไม่น่าจะหายไปอย่างแน่นอนเพราะตัวเลข 15 หลักหรือมากกว่านั้น

1
ฉันกำลังเล่นด้วยwidth_bucket(random(), 0, 1, 10)เป็นทางเลือก

ดูเหมือน

18

เพื่อสรุปและทำให้ง่ายขึ้นเล็กน้อยคุณสามารถใช้:

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

2
เอกสารบอกว่า "ค่าสุ่มอยู่ในช่วง 0.0 <= x <1.0" จึงมีอย่างน้อยโอกาสทางทฤษฎีของceil(random() * 10)ผลใน 0 - floorฉันจะติด

1
ฉันเห็นด้วยกับ @JackDouglas ดังนั้นสำหรับช่วง 1-10 ควรเป็นSELECT floor(random() * 10 + 1);
SergiyKolesnikov

10

หากคุณใช้ SQL Server วิธีที่ถูกต้องในการรับจำนวนเต็มคือ

SELECT Cast(RAND()*(b-a)+a as int);

ที่ไหน

  • 'b' คือขีด จำกัด บน
  • 'a' คือขีด จำกัด ล่าง

ระวังตรงนี้ถ้าคุณใส่ขีด จำกัด ล่างเป็น 1 และบนเป็น 10 คุณจะได้แค่ตัวเลข 1-> 9 เท่านั้น คำตอบอื่น ๆ ดูเหมือนจะสมมติว่าระหว่าง 1 ถึง 10 หมายถึง 1-> 9 ... ฉันขอแนะนำว่าถ้า 'ระหว่าง' ไม่รวมขอบเขตบนก็ควรไม่รวมส่วนล่าง (เช่น 2-> 9) เลือก Cast (RAND () * ((b + 1) -a) + a เป็น int);
Morvael

คำถามถูกติดแท็กอย่างชัดเจนว่าเป็นคำถาม PostgreSQL
Sebastian Palma

4

(trunc (สุ่ม () * 10)% 10) + 1


ข้อผิดพลาด: ไม่มีตัวดำเนินการ: จำนวนเต็ม% ความแม่นยำสองเท่า

1
แล้วทำไมคุณถึงใช้โมดูลัสล่ะ? ตรรกะนี้ไม่สมเหตุสมผล หากคุณได้รับ "การห่อ" ใด ๆ คุณจะไม่มีการกระจายที่เท่ากันและถ้าคุณไม่ได้รับก็ไม่จำเป็นต้องใช้
ErikE

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.


0

อันที่จริงฉันไม่รู้ว่าคุณต้องการสิ่งนี้

ลองดู

INSERT INTO my_table (my_column)
SELECT
    (random() * 10) + 1
;

0

กระบวนงานที่เก็บไว้นี้จะแทรกตัวเลขแรนด์ลงในตาราง มองออกไปมันแทรกตัวเลขที่ไม่มีที่สิ้นสุด หยุดดำเนินการเมื่อคุณมีจำนวนเพียงพอ

สร้างตารางสำหรับเคอร์เซอร์:

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

3
คำถามเกี่ยวกับ Postgres ไม่ใช่ SQL Server
a_horse_with_no_name
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.