MariaDB RAND() 函数的基础用法与实例
MariaDB RAND()
函数用来生成一个0到1范围内的随机浮点数。
MariaDB RAND()
函数用来生成一个 0 到 1 范围内的随机浮点数。该函数常被用于需要生成随机数的场景,比如数据打乱、随机抽样等。
语法
MairaDB RAND()
函数的语法如下:
RAND([X])
- 参数 X 是一个整数值,是可选的。
- 如果省略参数 X,函数会返回一个 0 到 1 范围内的非重复的随机浮点值。
- 如果指定了参数 X,函数会返回一个随机数种子,由该随机数种子决定之后的
RAND()
返回值序列。
实例
无参数调用
此实例演示了无参数调用 RAND()
函数的效果。
SELECT RAND(), RAND(), RAND();
以下是该语句的输出:
+--------------------+--------------------+--------------------+
| RAND() | RAND() | RAND() |
+--------------------+--------------------+--------------------+
| 0.2615751067749924 | 0.4511852156847578 | 0.4712007888324566 |
+--------------------+--------------------+--------------------+
每次执行,该语句会返回三个全新的 0 到 1 之间的随机浮点数。
指定种子生成伪随机数序列
此实例演示了如何使用指定的种子来生成一个伪随机数序列。
SELECT RAND(10), RAND(10), RAND(10), RAND(10);
以下是该语句的输出:
+--------------------+--------------------+--------------------+--------------------+
| RAND(10) | RAND(10) | RAND(10) | RAND(10) |
+--------------------+--------------------+--------------------+--------------------+
| 0.6570515219653505 | 0.6570515219653505 | 0.6570515219653505 | 0.6570515219653505 |
+--------------------+--------------------+--------------------+--------------------+
使用相同的种子值 10,RAND()
函数会生成一个固定的伪随机数序列。每次执行该语句时,序列中的下 4 个随机数都是相同的。
生成指定范围内的随机整数
RAND()
函数生成的是 0 到 1 范围的小数,我们常常需要生成指定范围内的随机整数。此实例演示了如何实现这一需求。
下面的语句生成 1 到 10 的随机整数
SELECT FLOOR(RAND() * 10 + 1);
以下是该语句的输出:
+------------------------+
| FLOOR(RAND() * 10 + 1) |
+------------------------+
| 7 |
+------------------------+
下面的语句生成 5 到 10 的随机整数
SELECT FLOOR(RAND() * (10 - 5 + 1) + 5);
以下是该语句的输出:
+----------------------------------+
| FLOOR(RAND() * (10 - 5 + 1) + 5) |
+----------------------------------+
| 9 |
+----------------------------------+
下面的语句生成 0 到 99 的随机整数:
SELECT FLOOR(RAND() * 100);
以下是该语句的输出:
+---------------------+
| FLOOR(RAND() * 100) |
+---------------------+
| 59 |
+---------------------+
根据随机范围的需要,我们可以对 RAND()
生成的小数进行缩放并取整,即可得到指定范围内的随机整数。
生成随机字符串/数字
RAND()
生成的随机小数经过合理的处理也可用于生成随机字母或数字等。此实例演示了如何生成 6 位随机字符串。
DROP TABLE IF EXISTS random_string;
CREATE TABLE random_string(str CHAR(6));
INSERT INTO random_string (str)
SELECT
CONCAT(
CHAR(FLOOR(RAND() * 26) + 97),
CHAR(FLOOR(RAND() * 26) + 97),
CHAR(FLOOR(RAND() * 26) + 97),
CHAR(FLOOR(RAND() * 26) + 97),
CHAR(FLOOR(RAND() * 26) + 97),
CHAR(FLOOR(RAND() * 26) + 97)
);
SELECT * FROM random_string;
以下是该语句的输出:
+--------+
| str |
+--------+
| oamidt |
+--------+
上述语句先创建了一个表,然后利用多个 RAND()
结合 CONCAT()
和 CHAR()
函数生成了一个包含 6 个小写字母的随机字符串并插入表中。
基于 RAND()实现加权随机数
在某些场景下,我们需要生成权重不等的随机数。此实例演示了如何基于 RAND()
实现这一需求。
DROP TABLE IF EXISTS weighted_rand;
CREATE TABLE weighted_rand (id INT, weight INT);
INSERT INTO weighted_rand VALUES
(1, 10), (2, 30), (3, 20), (4, 40);
SELECT
id,
SUM(weight) OVER (ORDER BY id) AS cumulative_weight
FROM weighted_rand;
SELECT
(SELECT id
FROM weighted_rand
WHERE @rand >=
(SELECT COALESCE(SUM(weight), 0)
FROM weighted_rand r2
WHERE r2.id < r1.id)
ORDER BY id
LIMIT 1
) AS random_id
FROM
(SELECT @rand := RAND() *
(SELECT SUM(weight) FROM weighted_rand)) rand_val,
weighted_rand r1;
以下是该语句的输出:
+-----------+
| random_id |
+-----------+
| 1 |
| 1 |
| NULL |
| NULL |
+-----------+
上述语句先插入了一个带权重的数据行。然后通过子查询的方式,利用累加权重和一个随机数作为判断条件,按照权重大小有概率地返回一个 id 值。这样可以实现权重越大,被选中的概率就越大。
结论
本文介绍了 MariaDB RAND()
函数的语法、用法和实例。RAND()
函数生成的是 0 到 1 范围内的随机小数,通过对结果值进行缩放和取整运算,可以生成期望范围内的随机整数。此外,利用 RAND()
和其他字符、数字处理函数的组合,还可以生成随机字符串和加权随机数等。RAND()
函数的应用场景非常广泛,为数据随机处理和统计抽样等带来了极大的便利。