MySQL / 13. Статистические методы

Генерация случайных чисел

Задача
Вам нужен источник случайных чисел.

Решение
Вызовите функцию MySQL RAND().

Обсуждение
В MySQL есть функция RAND(), которая генерирует случайные числа в диапазоне от 0 до 1:

mysql> SELECT RAND(), RAND(), RAND();

+-------------------+---------------------+--------------------+
| RAND()               | RAND()                | RAND()               |
+-------------------+---------------------+--------------------+
| 0.31466114177803 | 0.89354679723601 | 0.52375059157959 |
+-------------------+---------------------+--------------------+

Если указать функции целый аргумент, то RAND() использует заданное значение как начало последовательности случайных чисел. При каждой установке определенного значения в качестве начального RAND() будет генерировать повторяющиеся серии чисел:

mysql> SELECT RAND(1), RAND(), RAND();

+--------------------+--------------------+--------------------+
| RAND(1)              | RAND()               | RAND()               |
+--------------------+--------------------+--------------------+
| 0.18109050223705 | 0.75023211143001 | 0.20788908117254 |
+--------------------+--------------------+--------------------+

mysql> SELECT RAND(20000000), RAND(), RAND();

+--------------------+---------------------+--------------------+
| RAND(20000000)  | RAND()                 | RAND()               |
+--------------------+---------------------+--------------------+
| 0.24628307879556 | 0.020315642487552 | 0.36272900678472 |
+--------------------+---------------------+--------------------+

mysql> SELECT RAND(1), RAND(), RAND();

+--------------------+--------------------+--------------------+
| RAND(1)              | RAND()               | RAND()               |
+--------------------+--------------------+--------------------+
| 0.18109050223705 | 0.75023211143001 | 0.20788908117254 |
+--------------------+--------------------+--------------------+

mysql> SELECT RAND(20000000), RAND(), RAND();

+--------------------+---------------------+--------------------+
| RAND(20000000)  | RAND()                 | RAND()               |
+--------------------+---------------------+--------------------+
| 0.24628307879556 | 0.020315642487552 | 0.36272900678472 |
+--------------------+---------------------+--------------------+

Если вы хотите задавать начало последовательности случайных чисел случайным образом, выбирайте начальное значение RAND(), используя источник энтропии. Возможными источниками являются текущая временная метка и идентификатор соединения, по отдельности или в сочетании:

mysql> SELECT RAND(UNIX_TIMESTAMP()) AS rand1,
-> RAND(CONNECTION_ID()) AS rand2,
-> RAND(UNIX_TIMESTAMP()+CONNECTION_ID()) AS rand3;

+-------------------+---------------------+--------------------+
| rand1                  | rand2                   | rand3                  |
+-------------------+---------------------+--------------------+
| 0.50452774158169 | 0.18113064782799 | 0.50456789089792 |
+-------------------+---------------------+--------------------+

Однако если у вас есть другие источники начальных значений, лучше использовать их. Например, если в вашей системе имеется устройство /dev/random или /dev/urandom, то вы можете читать это устройство и использовать его для того, чтобы сгенерировать начальное значение для RAND().

Статьи по MySQL на эту тему:

Присваивание рангов
Рандомизация набора строк
Случайный выбор из набора строк

Вернуться в раздел: MySQL / 13. Статистические методы