MySQL でランダムな数値を出力する (MySQL)
MySQL
Published: 2020-11-03

やったこと

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)

参考