やったこと
MySQL で、テストデータを作成するときに、ランダムな数値を出力したいことがあったので
やってみます。
確認環境
$ mysql --version
mysql Ver 14.14 Distrib 5.6.25, for Linux (x86_64) using EditLine wrapper
調査
例えば、0 ~ 5
までの数字を出力するとします。
RAND
(0 <= v < 1.0) を返すROUND(X)
四捨五入するFLOOR(X)
X 以下で最大の整数値を返す
これを組み合わせ使います。
rand の動きチェック
mysql> SELECT RAND();
+---------------------+
| RAND() |
+---------------------+
| 0.28683608517687403 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT RAND();
+--------------------+
| RAND() |
+--------------------+
| 0.9208513711773337 |
+--------------------+
1 row in set (0.00 sec)
round の動きチェック
mysql> SELECT ROUND(2.4);
+------------+
| ROUND(2.4) |
+------------+
| 2 |
+------------+
1 row in set (0.00 sec)
mysql> SELECT ROUND(2.5);
+------------+
| ROUND(2.5) |
+------------+
| 3 |
+------------+
1 row in set (0.00 sec)
mysql> SELECT ROUND(2.47);
+-------------+
| ROUND(2.47) |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
floor の動きチェック
mysql> SELECT FLOOR(2.4);
+------------+
| FLOOR(2.4) |
+------------+
| 2 |
+------------+
1 row in set (0.00 sec)
mysql> SELECT FLOOR(3.2);
+------------+
| FLOOR(3.2) |
+------------+
| 3 |
+------------+
1 row in set (0.00 sec)
mysql> SELECT FLOOR(3.5);
+------------+
| FLOOR(3.5) |
+------------+
| 3 |
+------------+
1 row in set (0.00 sec)
0 ~ 5
までの数字を出力する (ROUND + RAND)
mysql> SELECT ROUND(RAND() * 5);
+-------------------+
| ROUND(RAND() * 5) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
mysql> SELECT ROUND(RAND() * 5);
+-------------------+
| ROUND(RAND() * 5) |
+-------------------+
| 5 |
+-------------------+
1 row in set (0.00 sec)
これだと
- 0.0 ~ 0.4 => 0
- 0.5 ~ 1.4 => 1
となり、端っこの方でばらつくかもしれません。
なので rand() x 6
して、0... ~ 5.9...
して切り捨てすればいい感じになりそうです。
0 ~ 5
までの数字を出力する (FLOOR + RAND)
mysql> SELECT FLOOR(RAND() * 6);
+-------------------+
| FLOOR(RAND() * 6) |
+-------------------+
| 4 |
+-------------------+
1 row in set (0.00 sec)
mysql> SELECT FLOOR(RAND() * 6);
+-------------------+
| FLOOR(RAND() * 6) |
+-------------------+
| 0 |
+-------------------+
1 row in set (0.00 sec)