Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tạo số ngẫu nhiên trong khoảng cho trước trong MySQL


Công thức

Sử dụng RAND() kết hợp FLOOR() để tạo số nguyên ngẫu nhiên trong khoảng [min, max]:

SELECT FLOOR(RAND() * (max - min + 1) + min) AS random_value;

Ví dụ: Số ngẫu nhiên từ 100 đến 200

mysql> SELECT FLOOR(RAND() * (200 - 100 + 1) + 100) AS RandomValue;
+-------------+ 
| RandomValue | 
+-------------+ 
| 144         | 
+-------------+ 
1 row in set (0.00 sec)

Chạy lại lần 2:

mysql> SELECT FLOOR(RAND() * (200 - 100 + 1) + 100) AS RandomValue;
+-------------+ 
| RandomValue | 
+-------------+ 
| 184         | 
+-------------+ 
1 row in set (0.00 sec)

Giải thích công thức

  • RAND(): Sinh số thực ngẫu nhiên [0, 1)
  • (max - min + 1): Phạm vi giá trị (kích thước khoảng)
  • RAND() * range: Mở rộng phạm vi thành [0, range)
  • + min: Dịch chuyển về khoảng [min, max+1)
  • FLOOR(): Làm tròn xuống thành số nguyên [min, max]

Ứng dụng thực tế

Tạo dữ liệu test

INSERT INTO products (name, price) 
SELECT CONCAT('Product ', n), FLOOR(RAND() * 900 + 100) 
FROM (SELECT 1 n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t;

Chọn ngẫu nhiên 1 hàng (Random row)

SELECT * FROM ten_bang ORDER BY RAND() LIMIT 1;

Phân ngẫu nhiên dữ liệu (A/B testing)

UPDATE users SET group_name = CASE 
    WHEN FLOOR(RAND() * 2) = 0 THEN 'A' 
    ELSE 'B' 
END;

Lưu ý hiệu năng

⚠️ ORDER BY RAND() chậm trên bảng lớn!
Thay thế cho bảng > 10k hàng:
-- Lấy ID min/max trước
SELECT @min_id := MIN(id), @max_id := MAX(id) FROM ten_bang;
-- Chọn ngẫu nhiên
SELECT * FROM ten_bang 
WHERE id >= FLOOR(RAND() * (@max_id - @min_id + 1) + @min_id) 
LIMIT 1;

MySQL 8.0: RAND() với seed

-- Kết quả lặp lại được (deterministic)
SELECT FLOOR(RAND(12345) * 100) AS deterministic_random;