NORMAL
声明
NORMAL(<mean> , <stddev> , <gen>)
说明
该函数返回一个符合正态分布(Normal Distribution,又称高斯分布)的浮点数。
mean表示均值,stddev表示标准差。mean和stddev的取值必须是标量值,不随行迭代而变。例如,整形或浮点型常量、标量函数等。mean和stddev的取值可以是1、2、ABS(-10);PL 里还可以是@v1、1+@v3等。mean和stddev的取值不可以是RAND()、RANDOM()、RAND(2)、t1.c1、ABS(-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)