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() 函数的应用场景非常广泛,为数据随机处理和统计抽样等带来了极大的便利。