宣言
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万個のランダム値を取得し(小数点以下1桁のみ保持)、その数を集計するものです。
obclient> 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
以下の例は、正規分布に従う100万個のランダム値を生成し、1.5秒を要するものです。
obclient> SELECT COUNT(NORMAL(0, 1, RANDOM())) v FROM TABLE(GENERATOR(1000000));
+---------+
| V |
+---------+
| 1000000 |
+---------+
1 row in set (1.49 sec)