tạo một số ngẫu nhiên bằng MYSQL


95

Tôi muốn biết có cách nào để chọn số được tạo ngẫu nhiên từ 100 đến 500 cùng với một truy vấn chọn lọc.

Ví dụ: SELECT name, address, random_number FROM users

Tôi không phải lưu trữ số này trong db và chỉ sử dụng nó cho mục đích hiển thị.

Tôi đã thử nó một cái gì đó như thế này, nhưng nó không thể hoạt động ..

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

Mong ai đó giúp tôi. Cảm ơn bạn


1
Vui lòng truy cập liên kết này stackoverflow.com/questions/1045138/…
DevelopmentIsMyPassion

Câu trả lời:


145

Điều này sẽ cung cấp cho những gì bạn muốn:

FLOOR(RAND() * 401) + 100

Nói chung, FLOOR(RAND() * (<max> - <min> + 1)) + <min>tạo ra một số giữa <min> và <max>bao gồm.

Cập nhật

Tuyên bố đầy đủ này sẽ hoạt động:

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

cách tôi sử dụng mã này. Tôi đã thử như thế này - FLOOR (RAND () * 401) + 100 dưới dạng số, nhưng không hoạt động
TNK

LƯU Ý: Tôi không có cột có tên 'số' trong db của mình. Đây phải là cột được tạo động. nó có khả thi không?
TNK

1
@EdHeal Trên thực tế, tôi nghĩ round()sẽ cung cấp một phân phối không đồng nhất.
Ja͢ck

1
Tốt hơn hãy lưu trữ kết quả vào một biến và sử dụng biến đó nếu bạn có bản sao phụ chính. SET @r=FLOOR(RAND() * 401) + 100, sau đó SELECT @r.
Qian Chen

3
RAND(), UUID(), NOW()Là chức năng indeterministic. Việc gọi các hàm như vậy nên tránh được ghi vào nhật ký bin để sao chép. Ví dụ. INSERT INTO t SET ID=UUID();sẽ làm cho giá trị của các IDtrường khác nhau trên chủ và nô lệ. Thay vào đó, nó cần được viết là SET @uuid:=UUID();, sau INSERT INTO t SET ID=@uuid;đó chạy chúng trong một giao dịch duy nhất. Điều này sẽ được nhân rộng an toàn. Đây là một chút lạc đề cho câu hỏi này. Nó không nói rằng câu trả lời của bạn có bất kỳ vấn đề nào. :)
Qian Chen

10

As RANDtạo ra một số 0 <= v <1,0 (xem tài liệu ) bạn cần sử dụng ROUNDđể đảm bảo rằng bạn có thể nhận được giới hạn trên (500 trong trường hợp này) và giới hạn dưới (100 trong trường hợp này)

Vì vậy, để tạo ra phạm vi bạn cần:

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

Mã hóa này hoạt động như thế này - CHỌN ROUND (100.0 + 400.0 * RAND ()) AS random_number, nhưng hiện đang hoạt động với truy vấn của tôi
TNK

cột random_number phải là cột được tạo ngẫu nhiên cùng với truy vấn của tôi.
TNK

1
Phương pháp này sẽ làm cho số đầu tiên và số cuối cùng ít khả năng hơn.
Slobodan Pejic

4

Bổ sung cho câu trả lời này, hãy tạo một hàm như

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

và gọi như

SELECT myrandom(100,300);

Điều này cung cấp cho bạn số ngẫu nhiên từ 100 đến 300


3

Bạn có thể tạo một số ngẫu nhiên bằng cách sử dụng FLOOR(RAND() * n) as randnum(n là một số nguyên), tuy nhiên nếu bạn không cần lặp lại cùng một số ngẫu nhiên thì bạn sẽ phải lưu trữ trong một bảng tạm thời. Vì vậy, bạn có thể kiểm tra nó với where randnum not in (select * from temptable)...


3

cả hai đều hoạt động tốt:

select round(<maxNumber>*rand())

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

0

Đây là công thức chính xác để tìm số nguyên từ đâu iđếnji <= R <= j

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

3
Điều này là sai, nó sẽ không bao giờ tạo ra j (hoặc max). Nó tạo ra một số i <= R <j.
jlh

1
Nên là:FLOOR(min+RAND()*(max-min+1))
David Rodrigues
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.