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


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

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

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


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)...


3

keduanya bekerja dengan baik:

select round(<maxNumber>*rand())

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

0

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.