RAND():回傳 0~1 間浮點數RAND(N):指定種子 N,產生可重複的確定性序列 (同種子同序列)-- 1. 建立範圍值表
CREATE TABLE rand_numbers (num INT PRIMARY KEY);
INSERT INTO rand_numbers VALUES (-5),(-4),(-3),(-2),(-1),(0),(1),(2),(3),(4),(5);
-- 2. 取隨機值
SELECT num FROM rand_numbers ORDER BY RAND() LIMIT 1;
-- 優點:支援任意離散值集合、邏輯直觀
-- 缺點:範圍大時建表維護成本高、ORDER BY RAND() 全表掃描效能差
-- 核心公式:RAND() 產生 0~1 → 平移縮放 → 四捨五入
-- 目標:-5 ~ 5 (共 11 個整數)
-- 步驟分解:
-- RAND() → [0, 1)
-- 0.5 - RAND() → (-0.5, 0.5]
-- (0.5 - RAND())*2 → (-1, 1]
-- (0.5 - RAND())*2*5 → (-5, 5]
-- ROUND(...) → -5, -4, ..., 4, 5 (整數)
SELECT ROUND((0.5 - RAND()) * 2 * 5) AS random_int;
-- 通用模板:任意範圍 [min, max]
SET @min = -100, @max = 100;
SELECT ROUND((0.5 - RAND()) * 2 * (@max - @min) / 2) + (@min + @max) / 2;
-- 簡化:FLOOR(RAND() * (@max - @min + 1)) + @min (更標準、分布均勻)
| 維度 | 查表法 | 數學轉換法 |
|---|---|---|
| 適用值分布 | 任意離散/非連續 | 連續整數範圍 |
| 範圍擴展性 | 差 (需手動維護表) | 極佳 (修改參數即可) |
| 查詢效能 | 低 (全表掃描 + filesort) | 極高 (純運算、常數摺疊) |
| 分布均勻性 | 取決於表資料分布 | 理論均勻 (RAND() 本質) |
| 可重複性 (種子) | 支援 ORDER BY RAND(seed) |
支援 RAND(seed) |
| 適用場景 | 抽獎池、固定選項集合、A/B 實驗分桶 | 隨機測試資料、模擬數據、遊戲隨機數 |
-- 產生 [min, max] 區間整數 (含邊界)
-- 公式:FLOOR(RAND() * (max - min + 1)) + min
-- 例:-5 ~ 5
SELECT FLOOR(RAND() * 11) - 5;
-- 例:1 ~ 100 (百分比)
SELECT FLOOR(RAND() * 100) + 1;
-- 批次生成 1000 筆測試資料
INSERT INTO test_rand (val)
SELECT FLOOR(RAND() * 1000) + 1
FROM (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1
CROSS JOIN (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2
CROSS JOIN (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3
CROSS JOIN (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t4
CROSS JOIN (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t5
LIMIT 1000;
-- 相同種子產生相同序列 (可用於測試驗證、分桶分配)
SELECT RAND(42), RAND(42), RAND(42); -- 每次結果相同
-- 分桶應用:用戶 ID 作為種子,固定分配到 1~10 桶
SELECT user_id, FLOOR(RAND(user_id) * 10) + 1 AS bucket FROM users;
-- A/B 測試:固定用戶分組
SELECT user_id, IF(RAND(user_id) < 0.5, 'A', 'B') AS variant FROM users;
ORDER BY RAND() **大表嚴禁使用**:全表掃描 + 臨時表 + filesort,百萬級資料查詢秒級甚至分鐘級WHERE RAND() < 0.01 (約 1% 抽樣,索引不可用但無排序開銷)SELECT * FROM t WHERE id >= (SELECT FLOOR(RAND() * (MAX(id)-MIN(id)+1)) + MIN(id) FROM t) LIMIT 10information_schema.tables 估算行數配合 LIMIT offset, 1RAND() 在主從可能產生不同值 (語句複寫)。行複寫 (RBR) 無影響RAND() 每行調用一次,SELECT RAND(), RAND() 產生兩個不同值MySQL 產生指定範圍隨機整數,**首選 FLOOR(RAND() * (max-min+1)) + min 數學轉換法**:效能極高、分布均勻、參數化靈活。查表法保留給離散值集合場景。牢記 ORDER BY RAND() 大表殺手特性,生產環境嚴禁直接使用。