Trong PostgreSQL, random()
hàm trả về một giá trị giả ngẫu nhiên trong phạm vi 0.0 <=x <1.0.
Nó sử dụng một thuật toán đồng dư tuyến tính đơn giản, là một trong những thuật toán tạo số giả ngẫu nhiên lâu đời nhất và nổi tiếng nhất.
Một số giả ngẫu nhiên là một số có vẻ là ngẫu nhiên, nhưng không thực sự là ngẫu nhiên. Một số giả ngẫu nhiên không phải là ngẫu nhiên thực sự vì giá trị của nó được tạo ra bởi một hạt giống đã biết. Tuy nhiên, nó sẽ có vẻ là ngẫu nhiên nếu người dùng không có kiến thức về hạt giống hoặc thuật toán đã tạo ra nó.
Do đó, các số giả ngẫu nhiên thường được coi là đủ tốt cho nhiều ứng dụng.
Ví dụ
Dưới đây là một ví dụ về việc tạo một số giả ngẫu nhiên với random()
chức năng.
SELECT random();
Kết quả:
0.625357600199532
Kết quả rõ ràng sẽ khác nhau mỗi khi bạn gọi nó.
Đây là một ví dụ khác mà tôi gọi hàm ba lần trong cùng một câu lệnh.
SELECT
random(),
random(),
random();
Kết quả:
random | random | random -------------------+---------------------+-------------------- 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314
Số ngẫu nhiên từ 1 đến 10
Dưới đây là một ví dụ về việc tạo một số dương từ 0 đến 10.
SELECT random() * 10 + 1;
Kết quả:
4.564859004063727
Nói rõ hơn, điều này tạo ra một số ngẫu nhiên> =1 và <10.
Số nguyên Ngẫu nhiên
Bạn có thể sử dụng một hàm như trunc()
hoặc floor()
để trả về số ngẫu nhiên dưới dạng số nguyên.
SELECT
trunc(random() * 10 + 1),
floor(random() * 10 + 1);
Kết quả:
trunc | floor -------+------- 1 | 8
Trả về hàng ngẫu nhiên
Bạn có thể sử dụng random()
trong một ORDER BY
mệnh đề của một truy vấn cơ sở dữ liệu để trả về các hàng ngẫu nhiên.
Đây là một ví dụ truy vấn pagila cơ sở dữ liệu mẫu.
SELECT
film_id,
title
FROM film
ORDER BY random() LIMIT 5;
Kết quả:
film_id | title ---------+--------------------- 116 | CANDIDATE PERDITION 806 | SLEEPY JAPANESE 892 | TITANIC BOONDOCK 826 | SPEED SUIT 612 | MUSSOLINI SPOILERS
Và đây là những gì tôi nhận được nếu chạy lại:
film_id | title ---------+-------------------- 450 | IDOLS SNATCHERS 827 | SPICE SORORITY 593 | MONTEREY LABYRINTH 529 | LONELY ELEPHANT 591 | MONSOON CAUSE
Nếu bạn có một bảng lớn và bạn cần trả lại tất cả các hàng (hoặc nhiều hàng), bạn có thể muốn sửa đổi truy vấn của mình thành một cái gì đó như sau:
SELECT *
FROM film
WHERE film_id IN
(SELECT film_id FROM film ORDER BY random() LIMIT 5);
Tạo số ngẫu nhiên lặp lại
Postgres cũng có setseed()
cho phép bạn đặt một hạt giống cho random()
tiếp theo cuộc gọi trong cùng một phiên.
Bạn có thể sử dụng setseed()
để tạo random()
có thể lặp lại cuộc gọi.
Xem Cách hoạt động của Setseed () trong Postgres để biết các ví dụ.