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

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

Решение
Вызовите функцию 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().
Теги:
статистические методы
Добавлено: 23 Июля 2018 20:35:25 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...