створення випадкового числа за допомогою MYSQL


95

Я хотів би знати, чи є спосіб вибрати випадково сформоване число між 100 і 500 разом із запитом вибору.

Наприклад: SELECT name, address, random_number FROM users

Мені не потрібно зберігати цей номер у дБ і використовувати його лише для відображення цілей.

Я спробував щось подібне, але це не може приступити до роботи ..

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

Сподіваюся, хтось мені допоможе. Дякую


1
Будь ласка, відвідайте це посилання stackoverflow.com/questions/1045138/…
DevelopmentIsMyPassion

Відповіді:


145

Це має дати те, що ви хочете:

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 як номер, але не працює
ТНК

ПРИМІТКА. У моїй базі даних немає стовпця з назвою „номер”. Це повинен бути динамічно генерований стовпець. це можливо?
ТНК

1
@EdHeal Насправді, я думаю, round()це дасть нерівномірний розподіл.
Ja͢ck

1
Краще зберігайте результат у змінній і використовуйте змінну, якщо у вас є головна реплікація веденого пристрою. SET @r=FLOOR(RAND() * 401) + 100, тоді SELECT @r.
Цянь Чень,

3
RAND(), UUID(), NOW()Є індетерміністі- функції. Викликання таких функцій слід уникати записування в журнал смітника для реплікації. Наприклад. INSERT INTO t SET ID=UUID();призведе до того, що значення IDполів буде різним для головного та підлеглого. Натомість його потрібно записати як SET @uuid:=UUID();, а потім INSERT INTO t SET ID=@uuid;, потім запустити їх в одній транзакції. Це буде безпечним для тиражування. Це трохи не відповідає темі цього питання. Це не означає, що ваша відповідь має якісь проблеми. :)
Цянь Чень,

10

Оскільки 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 ()) ЯК випадковий номер, але зараз працює з моїм запитом
TNK

random_number стовпець повинен бути випадково згенерованим стовпцем разом із моїм запитом.
ТНК

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

1
Має бути:FLOOR(min+RAND()*(max-min+1))
Девід Родрігес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.