สร้างตัวเลขสุ่มโดยใช้ MYSQL


98

ฉันต้องการทราบว่ามีวิธีการเลือกหมายเลขที่สร้างขึ้นแบบสุ่มระหว่าง 100 ถึง 500 พร้อมกับแบบสอบถามแบบเลือก

เช่น: SELECT name, address, random_number FROM users

ฉันไม่ต้องเก็บหมายเลขนี้ไว้ในฐานข้อมูลและใช้เพื่อแสดงวัตถุประสงค์เท่านั้น

ฉันลองทำแบบนี้แล้วแต่มันใช้งานไม่ได้ ..

SELECT name, address, FLOOR(RAND() * 500) AS random_number FROM users

หวังว่าจะมีคนช่วยฉันออกไป ขอบคุณ


1
กรุณาเยี่ยมชมที่ลิงค์นี้ stackoverflow.com/questions/1045138/…
DevelopmentIsMyPassion

คำตอบ:


149

สิ่งนี้ควรให้สิ่งที่คุณต้องการ:

FLOOR(RAND() * 401) + 100

โดยทั่วไปFLOOR(RAND() * (<max> - <min> + 1)) + <min>จะสร้างตัวเลขระหว่าง<min> และ<max>รวม

อัปเดต

ข้อความทั้งหมดนี้ควรใช้งานได้:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users

ฉันใช้รหัสนี้อย่างไร ฉันลองแบบนี้ - FLOOR (RAND () * 401) + 100 เป็นตัวเลข แต่ใช้ไม่ได้
TNK

หมายเหตุ: ฉันไม่มีคอลัมน์ชื่อ 'number' ในฐานข้อมูลของฉัน ต้องเป็นคอลัมน์ที่สร้างขึ้นแบบไดนามิก เป็นไปได้ไหม
TNK

1
@EdHeal จริงๆแล้วฉันคิดว่าround()จะแจกแจงแบบไม่สม่ำเสมอ
Ja͢ck

1
ควรเก็บผลลัพธ์ไว้ในตัวแปรและใช้ตัวแปรหากคุณมีการจำลองแบบทาสหลัก SET @r=FLOOR(RAND() * 401) + 100แล้วSELECT @r.
Qian Chen

3
RAND(), UUID(), NOW()ฟังก์ชั่น indeterministic การเรียกใช้ฟังก์ชันดังกล่าวควรหลีกเลี่ยงไม่ให้เขียนลงในบันทึกถังขยะเพื่อจำลองแบบ ตัวอย่างเช่น. INSERT INTO t SET ID=UUID();จะทำให้ค่าของIDฟิลด์แตกต่างกันไปสำหรับมาสเตอร์และทาส แต่จะต้องเขียนเป็นSET @uuid:=UUID();แล้วINSERT INTO t SET ID=@uuid;จึงเรียกใช้ในธุรกรรมเดียว นี่จะเป็นการจำลองแบบที่ปลอดภัย นี่เป็นหัวข้อเล็กน้อยสำหรับคำถามนี้ ไม่ได้บอกว่าคำตอบของคุณมีปัญหา :)
Qian Chen

10

เมื่อRANDสร้างตัวเลข 0 <= v <1.0 (ดูเอกสารประกอบ ) คุณต้องใช้ROUNDเพื่อให้แน่ใจว่าคุณจะได้รับขอบเขตบน (500 ในกรณีนี้) และขอบเขตล่าง (100 ในกรณีนี้)

ดังนั้นในการผลิตช่วงที่คุณต้องการ:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users

การเข้ารหัสนี้ทำงานเช่นนี้ - SELECT ROUND (100.0 + 400.0 * RAND ()) เป็น random_number แต่ตอนนี้ทำงานกับข้อความค้นหาของฉัน
TNK

คอลัมน์ random_number ต้องเป็นคอลัมน์ที่สร้างขึ้นแบบสุ่มพร้อมกับข้อความค้นหาของฉัน
TNK

1
วิธีนี้จะทำให้ตัวเลขแรกและตัวสุดท้ายมีโอกาสน้อยลง
Slobodan Pejic

4

เพิ่มเติมสำหรับคำตอบนี้สร้างฟังก์ชันเช่น

CREATE FUNCTION myrandom(
    pmin INTEGER,
    pmax INTEGER
)
RETURNS INTEGER(11)
DETERMINISTIC
NO SQL
SQL SECURITY DEFINER
BEGIN
  RETURN floor(pmin+RAND()*(pmax-pmin));
END; 

และโทรไลค์

SELECT myrandom(100,300);

สิ่งนี้จะให้หมายเลขสุ่มระหว่าง 100 ถึง 300


3

คุณสามารถสร้างตัวเลขสุ่มโดยใช้FLOOR(RAND() * n) as randnum(n เป็นจำนวนเต็ม) อย่างไรก็ตามหากคุณไม่ต้องการให้สุ่มหมายเลขเดียวกันซ้ำคุณจะต้องเก็บไว้ในตารางชั่วคราว เพื่อให้คุณสามารถตรวจสอบกับwhere randnum not in (select * from temptable)...


3

ทั้งสองทำงานได้ดี:

select round(<maxNumber>*rand())

FLOOR(RAND() * (<max> - <min> + 1)) + <min> // generates a number
between <min> and <max> inclusive.

0

นี่เป็นสูตรที่ถูกต้องในการหาจำนวนเต็มจากiถึงjที่i <= R <= j

FLOOR(min+RAND()*(max-min))

3
สิ่งนี้ผิดมันจะไม่สร้าง j (หรือสูงสุด) มันสร้างตัวเลข i <= R <j.
jlh

1
ควรจะเป็น:FLOOR(min+RAND()*(max-min+1))
David Rodrigues
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.