Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
MySQL, RAND(N,M)?
Новая тема
Ответить
цитата
27/09/10 в 13:25
FXIX
Сгенерить случайное целое число в диапазоне от N до M, - что за нереальная задача для мускуля?
mysql> select RAND();
+-------------------+
| RAND() |
+-------------------+
| 0.813593878237152 |
+-------------------+
1 row in set (0.00 sec)
mysql> select RAND(1, 7);
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'RAND'
mysql> select ROUND(RAND()*10, 0);
+---------------------+
| ROUND(RAND()*10, 0) |
+---------------------+
| 3 |
+---------------------+
1 row in set (0.00 sec)
mysql> select ROUND(RAND()*10, 0);
+---------------------+
| ROUND(RAND()*10, 0) |
+---------------------+
| 5 |
+---------------------+
1 row in set (0.00 sec)
mysql> select ROUND(RAND()*10, 0);
+---------------------+
| ROUND(RAND()*10, 0) |
+---------------------+
| 4 |
+---------------------+
1 row in set (0.00 sec)
от 0 до 10 генерит. как сделать от 3 до 6 к примеру? пхп мучать?
цитата
27/09/10 в 13:41
Еugene
в гугле тебя забанили?
Цитата:
To obtain a random integer R in the range i <= R < j, use the expression FLOOR(i + RAND() * (j – i)).
цитата
27/09/10 в 14:03
FXIX
mysql> select FLOOR(3 + RAND() * (6 – 3));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '– 3))' at line 1
цитата
27/09/10 в 14:07
Еugene
понедельник день тяжелый.
у тебя минус неправильный
спецсимвол кривой из какой-то другой кодировки.
просто сотри минус и заново напиши
mysql> select FLOOR(3 + RAND() * (6 - 3));
+-----------------------------+
| FLOOR(3 + RAND() * (6 - 3)) |
+-----------------------------+
| 5 |
+-----------------------------+
1 row in set (0.02 sec)
mysql> select FLOOR(3 + RAND() * (6 - 3));
+-----------------------------+
| FLOOR(3 + RAND() * (6 - 3)) |
+-----------------------------+
| 3 |
+-----------------------------+
1 row in set (0.00 sec)
mysql> select FLOOR(3 + RAND() * (6 - 3));
+-----------------------------+
| FLOOR(3 + RAND() * (6 - 3)) |
+-----------------------------+
| 4 |
+-----------------------------+
цитата
27/09/10 в 14:25
FXIX
как ты увидел что минус не тот? Вот стопицот тысяч раз из веба копипастил - первый раз проблема такая. кстати не только минус а еще что-то, - пришлось руками всю команду переписать чтобы заработала. но заработала
. спасибо.
И второй вопрос как часть первого.
К текущей дате добавляем рандомное кол-во дней\часов\минут. что не хватает?
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-add
mysql> SELECT DATE_ADD(CURDATE(), INTERVAL "FLOOR(1+RAND()*(4-1)) FLOOR(1+RAND()*(4-1)):FLOOR(1+RAND()*(4-1))" DAY_MINUTE) as colum;
+-------+
| colum |
+-------+
| NULL |
+-------+
1 row in set (0.00 sec)
в то время как простая запись:
mysql> SELECT DATE_ADD(CURDATE(), INTERVAL "2 2:2" DAY_MINUTE) colum;
+---------------------+
| colum |
+---------------------+
| 2010-09-29 02:02:00 |
+---------------------+
1 row in set (0.00 sec)
вроде на преобразование типов не грешу. add_date ждет строку. floor отдает число но сам в "кавычках"
цитата
27/09/10 в 14:55
Еugene
mysql> SELECT DATE_ADD(CURDATE(), INTERVAL CONCAT(FLOOR(1+RAND()*(4-1)),"\" ",FLOOR(1+RAND()*(4-1)),":",FLOOR(1+RAND()*(4-1)),"\"") DAY_MINUTE) as colum;
+---------------------+
| colum |
+---------------------+
| 2010-09-29 01:01:00 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT DATE_ADD(CURDATE(), INTERVAL CONCAT(FLOOR(1+RAND()*(4-1)),"\" ",FLOOR(1+RAND()*(4-1)),":",FLOOR(1+RAND()*(4-1)),"\"") DAY_MINUTE) as colum;
+---------------------+
| colum |
+---------------------+
| 2010-09-29 03:01:00 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT DATE_ADD(CURDATE(), INTERVAL CONCAT(FLOOR(1+RAND()*(4-1)),"\" ",FLOOR(1+RAND()*(4-1)),":",FLOOR(1+RAND()*(4-1)),"\"") DAY_MINUTE) as colum;
+---------------------+
| colum |
+---------------------+
| 2010-09-29 01:01:00 |
+---------------------+
1 row in set (0.00 sec)
в кавычках вся проблема. внутри кавычек - строка. функция вычисления случайного числа там не выполняется.
цитата
27/09/10 в 15:29
FXIX
спасибо. монстр
цитата
27/09/10 в 18:10
taj
Извените, но накуя вот это
Цитата:
RAND()*(4-1)
???
цитата
27/09/10 в 18:15
Еugene
для наглядности. что б показать, что от 1 до 4х искомое число.
цитата
27/09/10 в 18:27
FXIX
от 1 включительно до 4 невключительно.
а вообще, да. чет мозгом не могу понять как это работает
FLOOR(1+RAND()*(4-1)):
- RAND() - генерит рандомное число от 0 до 1.0
- умножаем на 3 (зачем?)
- прибавляем 1 (зачем?)
- FLOOR(N) — дергает наибольшее целое число относительно N.xxx отбрасывая числа после запятой.
цитата
27/09/10 в 21:19
remorhaz
Ну смотри, пусть тебе надо сгенерить число от 3 до 6. Это можно представить как генерацию числа от 0 до 3, к которому прибавляем единицу. Генерировать средствами мускуля мы можем только от 0 до 1, значит, домножаем сгенерированное на 3 (получится от 0 до 3) и прибавляем 3 (получится от 3 до 6), ну и округлем, ясен перец.
цитата
29/09/10 в 16:15
FXIX
понял
Новая тема
Ответить
Эта страница в полной версии