跳到主要内容

NORMAL

声明

NORMAL(<mean> , <stddev> , <gen>)

说明

该函数返回一个符合正态分布(Normal Distribution,又称高斯分布)的浮点数。

  • mean 表示均值,stddev 表示标准差。
  • meanstddev 的取值必须是标量值,不随行迭代而变。例如,整形或浮点型常量、标量函数等。
    • meanstddev 的取值可以是 12ABS(-10);PL 里还可以是 @v11+@v3 等。
    • meanstddev 的取值不可以是 RAND()RANDOM()RAND(2)t1.c1ABS(-t1.c1)1+c2 等。
  • 随机值生成算法基于 std::normal_distribution,采用了 “Marsaglia Polar Method”算法,该算法会消耗较多 CPU。
  • gen 是一个数值生成函数,通常使用 RANDOM() 函数生成。如果传入值是一个常量,则 NORMAL() 函数返回值也为一个定值。

示例

如下示例为对 100 万个符合正态分布的随机数值进行取值(只保留小数点后一位),并统计数量。

SELECT v, COUNT(*) FROM (SELECT ROUND(NORMAL(3, 0.1, RANDOM()), 1) v FROM TABLE(GENERATOR(1000000))) x GROUP BY v ORDER BY v;
+------+----------+
| v | COUNT(*) |
+------+----------+
| 2.5 | 4 |
| 2.6 | 238 |
| 2.7 | 5979 |
| 2.8 | 60889 |
| 2.9 | 241991 |
| 3.0 | 382951 |
| 3.1 | 241306 |
| 3.2 | 60533 |
| 3.3 | 5861 |
| 3.4 | 243 |
| 3.5 | 5 |
+------+----------+
11 rows in set (2.567 sec)

如下示例为生成 100 万个符合正态分布的随机数值,耗时 1.5 秒。

SELECT COUNT(NORMAL(0, 1, RANDOM())) v FROM TABLE(GENERATOR(1000000));
+---------+
| V |
+---------+
| 1000000 |
+---------+
1 row in set (1.812 sec)