宣言
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)