создание случайного числа с использованием MYSQL


96

Я хотел бы знать, есть ли способ выбрать случайно сгенерированное число от 100 до 500 вместе с запросом выбора.

Например: SELECT name, address, random_number FROM users

Мне не нужно хранить это число в db и использовать его только для отображения цели.

Я пробовал что-то вроде этого, но не получается ..

SELECT name, address, FLOOR(RAND() * 500) AS random_number FROM users

Надеюсь, кто-нибудь мне поможет. Спасибо


1
Посетите эту ссылку stackoverflow.com/questions/1045138/…
DevelopmentIsMyPassion

Ответы:


146

Это должно дать то, что вы хотите:

FLOOR(RAND() * 401) + 100

Как правило, FLOOR(RAND() * (<max> - <min> + 1)) + <min>генерирует число от <min> до <max>включительно.

Обновить

Это полное заявление должно работать:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users

как я использую этот код. Я пробовал вот так - FLOOR (RAND () * 401) + 100 в качестве числа, но не работал
TNK

ПРИМЕЧАНИЕ. В моей базе данных нет столбца с именем 'number'. Это должен быть динамически генерируемый столбец. это возможно?
TNK

1
@EdHeal Вообще-то думаю round()даст неравномерное распределение.
Ja͢ck

1
Лучше сохранить результат в переменной и использовать эту переменную, если у вас есть репликация главного подчиненного устройства. SET @r=FLOOR(RAND() * 401) + 100, тогда SELECT @r.
Qian Chen

3
RAND(), UUID(), NOW()Являются индетерминисти- функции. Следует избегать записи вызовов таких функций в журнал корзины для репликации. Например. INSERT INTO t SET ID=UUID();приведет к тому, что значения IDполей будут разными на главном и подчиненном устройствах. Вместо этого его нужно записать как SET @uuid:=UUID();, а INSERT INTO t SET ID=@uuid;затем запустить их в одной транзакции. Это будет безопасно для репликации. Это немного не по теме этого вопроса. Это не значит, что в вашем ответе есть проблемы. :)
Qian Chen

10

As RANDпроизводит число 0 <= v <1.0 (см. Документацию ), которое необходимо использовать, ROUNDчтобы убедиться, что вы можете получить верхнюю границу (500 в этом случае) и нижнюю границу (100 в этом случае)

Итак, для производства необходимого ассортимента:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users

Эта кодировка работает так - ВЫБРАТЬ КРУГЛЫЙ (100.0 + 400.0 * RAND ()) AS random_number, но теперь работает с моим запросом
TNK

Столбец random_number должен быть случайно сгенерированным столбцом вместе с моим запросом.
TNK

1
Этот метод снизит вероятность первого и последнего числа.
Слободан Пежич

4

В дополнение к этому ответу создайте такую ​​функцию, как

CREATE FUNCTION myrandom(
    pmin INTEGER,
    pmax INTEGER
)
RETURNS INTEGER(11)
DETERMINISTIC
NO SQL
SQL SECURITY DEFINER
BEGIN
  RETURN floor(pmin+RAND()*(pmax-pmin));
END; 

и позвони как

SELECT myrandom(100,300);

Это дает вам случайное число от 100 до 300


3

Вы можете создать случайное число, используя FLOOR(RAND() * n) as randnum(n - целое число), однако, если вам не нужно повторять одно и то же случайное число, вам придется несколько сохранить его во временной таблице. Так что вы можете проверить это с помощью where randnum not in (select * from temptable)...


3

они оба работают хорошо:

select round(<maxNumber>*rand())

FLOOR(RAND() * (<max> - <min> + 1)) + <min> // generates a number
between <min> and <max> inclusive.

0

Это правильная формула , чтобы найти целые числа от iдо , jгдеi <= R <= j

FLOOR(min+RAND()*(max-min))

3
Это неправильно, он никогда не даст j (или max). Он производит число i <= R <j.
jlh 08

1
Должно быть:FLOOR(min+RAND()*(max-min+1))
Дэвид Родригес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.