Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

สุ่มตัวเลขในช่วงที่กำหนดใน MySQL ด้วย RAND()

ฟังก์ชัน RAND() ใน MySQL สุ่มค่าทศนิยมระหว่าง 0 ถึง 1 (0 ≤ RAND() < 1) เพื่อสุ่มจำนวนเต็มในช่วงที่ต้องการ ให้ใช้สูตรคณิตศาสตร์ร่วมกับ FLOOR()

สูตรสุ่มจำนวนเต็มในช่วง [min, max]

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

ตัวอย่าง: สุ่มเลข 1 ถึง 14

1. สร้างตารางและเพิ่มข้อมูลตัวเลข 1-14

mysql> CREATE TABLE RandomIntegerDemo (Number INT);
Query OK, 0 rows affected (0.61 sec)

mysql> INSERT INTO RandomIntegerDemo VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14);
Query OK, 14 rows affected (0.14 sec)

2. สุ่มค่าใหม่สำหรับแต่ละแถว

mysql> SELECT Number, (FLOOR(1 + RAND() * 14)) AS RandomValue
    -> FROM RandomIntegerDemo
    -> LIMIT 0, 14;
+--------+-------------+
| Number | RandomValue |
+--------+-------------+
| 1      | 9           |
| 2      | 8           |
| 3      | 13          |
| 4      | 13          |
| 5      | 10          |
| 6      | 10          |
| 7      | 7           |
| 8      | 3           |
| 9      | 8           |
| 10     | 2           |
| 11     | 14          |
| 12     | 6           |
| 13     | 3           |
| 14     | 9           |
+--------+-------------+
14 rows in set (0.00 sec)

การใช้งานจริง: สุ่มลำดับแถว (Random Order)

SELECT * FROM your_table ORDER BY RAND() LIMIT 10;

เหมาะสำหรับ: แสดงสินค้าสุ่ม, แบบสำรวจสุ่ม, A/B testing

การใช้ SEED เพื่อผลลัพธ์ที่ทำซ้ำได้

SELECT RAND(42);  -- จะได้ค่าเดิมทุกครั้งที่ใช้ SEED เดียวกัน

ใช้ในการทดสอบหรือ Debug ที่ต้องการผลลัพธ์ซ้ำได้

ข้อควรระวังด้านประสิทธิภาพ

  • ORDER BY RAND() ช้ามากสำหรับตารางใหญ่ (Full table scan + filesort)
  • สำหรับตารางใหญ่ ควรสุ่ม Primary Key แล้ว JOIN กลับมา แทน
  • RAND() เรียกใหม่ทุกแถว ไม่สามารถใช้ Index ได้

ฟังก์ชันสุ่มอื่นๆ

  • RANDOM_BYTES(len) - สุ่มไบต์ (สำหรับ token, salt)
  • UUID() - สร้าง UUID v1
  • UUID_SHORT() - สร้าง 64-bit unique ID