TDengine 数学函数 RAND 用户手册

RAND 函数
语法
RAND([seed])
功能说明
返回一个从 0 到 1 均匀分布的随机数。
版本
v3.3.3.0
返回结果类型
DOUBLE
适用数据类型
seed:INTEGER(可选参数)
嵌套子查询支持
适用于内层查询和外层查询。
适用于
表和超级表。
使用说明
- 如果指定了
seed值,将使用指定的seed作为随机种子,确保生成的随机数序列具有确定性(可重复性)。 - 如果不指定
seed参数,每次调用将返回不同的随机数。 - 返回值范围为 [0, 1) 之间的 DOUBLE 类型浮点数。
- 若
seed为 NULL,返回 NULL。 - 只能与普通列、选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
- 在表查询场景下,RAND 函数会为每一行数据生成独立的随机数。
示例所用表与数据(可直接复制执行)
-- 建库与使用
CREATE DATABASE IF NOT EXISTS power;
USE power;-- 智能电表表结构(带相位信息)
CREATE STABLE meters (ts TIMESTAMP,current FLOAT,voltage INT,phase FLOAT,power DOUBLE
) TAGS (groupid INT,location VARCHAR(64)
);-- 子表
CREATE TABLE d1001 USING meters TAGS (1, 'California.SanFrancisco');
CREATE TABLE d1002 USING meters TAGS (2, 'California.LosAngeles');-- 写入数据
INSERT INTO d1001 VALUES('2024-01-01 10:00:00.000', 10.3, 220, 30.0, 2266.0),('2024-01-01 10:01:00.000', 12.6, 221, 45.0, 2784.6),('2024-01-01 10:02:00.000', 8.5, 223, 60.0, 1895.5),('2024-01-01 10:03:00.000', 11.2, 222, 120.0, 2486.4);INSERT INTO d1002 VALUES('2024-01-01 10:00:00.000', 9.0, 219, 0.0, 1971.0),('2024-01-01 10:01:00.000', 14.0, 222, 90.0, 3108.0),('2024-01-01 10:02:00.000', 7.2, 220, 180.0, 1584.0),('2024-01-01 10:03:00.000', 10.5, 221, -30.0, 2320.5);
基础示例
示例 1: 无种子的随机数生成
-- 返回一个随机数
taos> SELECT RAND();rand() |
============================0.202092426923147 |-- 再次调用返回不同的随机数
taos> SELECT RAND();rand() |
============================0.131537788143166 |
示例 2: 使用固定种子生成可重复的随机数
-- 使用种子 1
taos> SELECT RAND(1);rand(1) |
============================0.000007826369259 |-- 相同种子返回相同结果
taos> SELECT RAND(1);rand(1) |
============================0.000007826369259 |-- 使用不同种子
taos> SELECT RAND(100);rand(100) |
============================0.154633387365937 |
示例 3: NULL 值处理
taos> SELECT RAND(NULL);rand(null) |
========================NULL |
示例 4: 在表查询中为每行生成随机数
-- 每行数据都会生成不同的随机数
taos> SELECT ts, current, RAND() AS random_value FROM d1001 LIMIT 3;ts | current | random_value |
===================================================================2024-01-01 10:00:00.000 | 10.300000 | 0.456789123456789 |2024-01-01 10:01:00.000 | 12.600000 | 0.789012345678901 |2024-01-01 10:02:00.000 | 8.500000 | 0.234567890123456 |
示例 5: 生成指定范围的随机数
-- 生成 [0, 100) 范围的随机数
taos> SELECT RAND() * 100 AS rand_0_100;rand_0_100 |
========================45.678912345678 |-- 生成 [10, 50) 范围的随机数
taos> SELECT 10 + RAND() * 40 AS rand_10_50;rand_10_50 |
========================32.145678901234 |
智能电表场景示例
示例 6: 随机抽样数据质量检查
目的:从海量电表数据中随机抽样进行数据质量检查,避免总是检查相同的数据。
-- 随机抽样 10% 的数据进行质量检查
SELECT ts, current, voltage, power
FROM d1001
WHERE RAND() < 0.1
ORDER BY ts;
应用价值:
- 实现公平的随机抽样
- 避免抽样偏差
- 降低检查成本
示例 7: 负载测试数据生成
目的:为负载测试生成模拟的随机扰动数据,使测试更接近真实场景。
-- 在实际功率基础上添加 ±5% 的随机扰动
SELECT ts,power AS actual_power,power * (0.95 + RAND() * 0.1) AS simulated_power
FROM d1001
ORDER BY ts;
应用价值:
- 模拟真实电网的功率波动
- 测试系统对异常值的处理能力
- 验证告警阈值的合理性
示例 8: A/B 测试分组
目的:将电表随机分配到不同的测试组,用于对比不同算法或策略的效果。
-- 将电表随机分为两组(A组和B组)
SELECT tbname,location,CASE WHEN RAND() < 0.5 THEN 'Group A'ELSE 'Group B'END AS test_group
FROM meters
GROUP BY tbname, location;
应用价值:
- 实现公平的实验分组
- 避免选择偏差
- 提高实验结果可信度
示例 9: 随机时间点数据采样
目的:在时间序列数据中随机选择数据点进行分析,减少计算量。
-- 使用固定种子确保可重复的随机采样
SELECT ts, current, voltage, phase
FROM d1002
WHERE RAND(42) < 0.2 -- 采样约 20% 的数据
ORDER BY ts;
应用价值:
- 大数据集的快速分析
- 趋势预览和可视化
- 降低存储和传输成本
示例 10: 模拟传感器噪声
目的:在仿真环境中为传感器数据添加随机噪声,模拟真实测量误差。
-- 为电流数据添加高斯噪声(简化版,使用均匀分布近似)
SELECT ts,current AS original_current,current + (RAND() - 0.5) * 0.2 AS noisy_current
FROM d1001
ORDER BY ts;
应用价值:
- 测试数据清洗算法
- 验证滤波器效果
- 评估系统鲁棒性
示例 11: 随机延迟模拟
目的:模拟数据传输延迟,测试系统对乱序数据的处理能力。
-- 为每条记录添加随机延迟(0-5秒)
SELECT ts,ts + CAST(RAND() * 5000 AS BIGINT) AS delayed_ts,current,voltage
FROM d1001
ORDER BY delayed_ts;
应用价值:
- 测试时序数据库的乱序写入能力
- 验证数据同步机制
- 评估实时性要求
生产场景应用与目的
场景 A: 统计抽样分析(降低计算成本)
目的:对海量历史数据进行统计分析时,通过随机抽样减少计算量,同时保证统计结果的代表性。
示例:
-- 从过去一个月的数据中随机抽样 1% 进行趋势分析
SELECT _wstart AS time_window,AVG(power) AS avg_power,MAX(power) AS max_power,MIN(power) AS min_power
FROM meters
WHERE ts >= NOW - 30dAND RAND() < 0.01 -- 1% 抽样率
INTERVAL(1h);
场景 B: 负载均衡测试(压力分散)
目的:在性能测试中随机选择设备进行压力测试,避免集中测试对系统造成过大冲击。
示例:
-- 随机选择 10% 的设备进行高频查询测试
SELECT tbname, COUNT(*) AS record_count,AVG(power) AS avg_power
FROM meters
WHERE ts >= NOW - 1hAND RAND() < 0.1
GROUP BY tbname;
场景 C: 数据脱敏(隐私保护)
目的:在数据分享或演示时,通过添加随机扰动保护敏感信息。
示例:
-- 对功率数据进行随机化处理(保持趋势但隐藏精确值)
SELECT ts,location,FLOOR(power * (0.9 + RAND() * 0.2)) AS anonymized_power
FROM meters
WHERE ts >= NOW - 1d;
场景 D: 随机告警抑制(避免告警风暴)
目的:当大量设备同时触发告警时,随机选择部分设备发送告警,避免告警系统过载。
示例:
-- 只对随机 20% 的异常设备发送告警
SELECT tbname,ts,voltage,'Voltage out of range' AS alert_message
FROM meters
WHERE voltage > 240 OR voltage < 200AND RAND() < 0.2; -- 随机抑制 80% 的告警
注意事项
-
随机性质量:RAND() 使用伪随机数生成器,适用于大多数应用场景,但不适合密码学用途。
-
性能考虑:在大数据集上使用
WHERE RAND() < threshold进行抽样时,仍需扫描全表,性能开销较大。对于大规模抽样,建议使用 SAMPLE 函数。 -
种子的使用:
- 在需要可重复结果的场景(如调试、测试)使用固定种子
- 在需要真随机性的场景(如生产环境抽样)不指定种子
-
分布特性:RAND() 返回均匀分布,如需其他分布(如正态分布),需要额外的数学变换。
-
NULL 值传播:种子为 NULL 时结果为 NULL,使用时需注意过滤。
-
并发一致性:在并发查询场景下,即使使用相同种子,不同客户端的随机序列可能不同。
数学关系
- 均匀分布:
P(a ≤ RAND() ≤ b) = b - a,其中 0 ≤ a < b ≤ 1 - 范围转换:
[min, max) = min + RAND() * (max - min) - 整数随机数:
FLOOR(RAND() * n)生成 [0, n) 范围的整数 - 概率采样:
RAND() < p实现概率 p 的伯努利采样
相关函数
- SAMPLE:结构化采样函数,性能优于 RAND() 过滤
- UNIQUE:去重函数,可与 RAND() 结合实现随机去重
- FLOOR/CEIL:与 RAND() 结合生成随机整数
- CAST:类型转换,用于生成特定类型的随机数
函数意义与实际应用价值
数学意义
RAND 函数基于伪随机数生成算法(通常是线性同余生成器或梅森旋转算法),能够生成统计上均匀分布的随机数序列。当提供种子时,确保随机序列的可重复性。
实际应用价值
-
数据采样
- 减少大数据集的处理时间
- 保证样本的随机性和代表性
- 支持分层抽样和配额抽样
-
测试与模拟
- 生成测试数据
- 模拟随机事件
- 压力测试和负载测试
-
算法验证
- A/B 测试分组
- 随机化实验设计
- 蒙特卡洛模拟
-
系统优化
- 负载均衡
- 告警抑制
- 流量控制
-
隐私保护
- 数据脱敏
- 差分隐私
- 噪声注入
本用户手册提供了 RAND 函数的完整使用说明,特别针对电力系统中的数据采样、测试模拟、负载均衡等实际需求,方便用户快速上手并应用于生产环境。
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。
