membuat nomor acak menggunakan MYSQL

96

Saya ingin tahu apakah ada cara untuk memilih nomor yang dibuat secara acak antara 100 dan 500 bersama dengan kueri pemilihan.

Misalnya: SELECT name, address, random_number FROM users

Saya tidak perlu menyimpan nomor ini dalam db dan hanya menggunakannya untuk menampilkan tujuan.

Saya mencoba sesuatu seperti ini, tetapi tidak berhasil ..

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

Semoga seseorang membantu saya. Terima kasih

TNK
sumber
1
Silakan kunjungi tautan ini stackoverflow.com/questions/1045138/…
DevelopmentIsMyPassion

Jawaban:

146

Ini harus memberikan apa yang Anda inginkan:

FLOOR(RAND() * 401) + 100

Secara umum, FLOOR(RAND() * (<max> - <min> + 1)) + <min>menghasilkan angka antara <min> dan <max>inklusif.

Memperbarui

Pernyataan lengkap ini seharusnya berfungsi:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users
Mendongkrak
sumber
bagaimana saya menggunakan kode ini. Saya mencoba seperti ini - LANTAI (RAND () * 401) + 100 sebagai angka, tetapi tidak berfungsi
TNK
CATATAN: Saya tidak memiliki kolom bernama 'nomor' di db saya. Ini harus kolom yang dibuat secara dinamis. apakah itu mungkin?
TNK
1
@EdHeal Sebenarnya menurut saya round()akan memberikan distribusi yang tidak seragam.
Ja͢ck
1
Lebih baik simpan hasilnya ke variabel dan gunakan variabel jika Anda memiliki replikasi slave master. SET @r=FLOOR(RAND() * 401) + 100, lalu SELECT @r.
Qian Chen
3
RAND(), UUID(), NOW()Adalah fungsi indeterministic. Pemanggilan fungsi tersebut harus dihindari agar tidak ditulis ke dalam log bin untuk replikasi. Sebagai contoh. INSERT INTO t SET ID=UUID();akan menyebabkan nilai IDfield berbeda pada master dan slaves. Sebaliknya itu perlu ditulis sebagai SET @uuid:=UUID();, dan kemudian INSERT INTO t SET ID=@uuid;, kemudian menjalankannya dalam satu transaksi. Ini akan menjadi replikasi yang aman. Ini sedikit keluar dari topik untuk pertanyaan ini. Itu tidak mengatakan jawaban Anda memiliki masalah. :)
Qian Chen
10

As RANDmenghasilkan angka 0 <= v <1.0 (lihat dokumentasi ) yang perlu Anda gunakan ROUNDuntuk memastikan bahwa Anda bisa mendapatkan batas atas (500 dalam kasus ini) dan batas bawah (100 dalam kasus ini)

Jadi untuk menghasilkan kisaran yang Anda butuhkan:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users
Ed Heal
sumber
Pengodean ini bekerja seperti ini - PILIH ROUND (100.0 + 400.0 * RAND ()) AS random_number, tetapi sekarang bekerja dengan kueri saya
TNK
random_number kolom harus kolom yang dibuat secara acak bersama dengan kueri saya.
TNK
1
Metode ini akan memperkecil kemungkinan angka pertama dan terakhir.
Slobodan Pejic
4

Tambahan untuk jawaban ini, buat fungsi seperti

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

dan menelepon seperti

SELECT myrandom(100,300);

Ini memberi Anda nomor acak antara 100 dan 300

Kadir Erturk
sumber
3

Anda dapat membuat nomor acak menggunakan FLOOR(RAND() * n) as randnum(n adalah bilangan bulat), namun jika Anda tidak memerlukan nomor acak yang sama untuk diulang, maka Anda harus menyimpannya di tabel temp. Jadi Anda dapat memeriksanya dengan where randnum not in (select * from temptable)...

bonCodigo
sumber
3

keduanya bekerja dengan baik:

select round(<maxNumber>*rand())

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

Ini adalah rumus yang benar untuk menemukan bilangan bulat dari ike jmanai <= R <= j

FLOOR(min+RAND()*(max-min))
ﻂﺎﻫﺭ ﻏﻔﺎﺮ
sumber
3
Ini salah, tidak akan pernah menghasilkan j (atau max). Ini menghasilkan angka i <= R <j.
jlh
1
Seharusnya:FLOOR(min+RAND()*(max-min+1))
David Rodrigues