Tôi đang tìm cách tạo số theo phân phối gaussian và lần đầu tiên tìm thấy bài đăng này. Đây là lý do tôi chia sẻ những gì tôi đã tìm thấy ngay sau:
Có, vì ít nhất PostGreSQL 8.4, một mô-đun bổ sung được gọi là tablefunc (http://www.postgresql.org/docs/9.2/static/tablefunc.html).
Nó đề xuất một hàm normal_rand (n, mean, stddev) tạo ra các số giả ngẫu nhiên bằng cách sử dụng phân phối gaussian (do đó hàm này trả về một tập các giá trị, thường được sử dụng trong mệnh đề FROM). Tuy nhiên, nếu bạn đặt n là 1, nó có thể được sử dụng như một hàm trả về một giá trị chứ không phải một tập hợp các giá trị.
Xét một nb10 bảng chứa 10 hồ sơ, hai truy vấn sau đây trả về một tập hợp của 10 số giả ngẫu nhiên sau một phân bố gaussian chuẩn (trung bình = 0, stddev = 1)
SELECT normal_rand(1, 0, 1) FROM nb10;
và
SELECT * from normal_rand(10, 0, 1);
tôi hy vọng điều này có thể giúp bất cứ ai trong tương lai ... :-)
Để trả lời câu hỏi của bạn đặc biệt, bạn có thể sử dụng một cái gì đó như:
SELECT floor(random_rand(1, 0, 1) * 250 + 125);
Thật không may, có thể nhận được câu trả lời không nằm trong khoảng [0, 249] khi sử dụng truy vấn này.Bạn có thể ví dụ:
- sử dụng một truy vấn đệ quy, mà tôi tìm thấy một overkill bit, cho loại bỏ giá trị không nằm trong khoảng [0, 249], hoặc
- làm chọn của bạn thành một vòng sang ngôn ngữ máy chủ của bạn , chỉ chấp nhận giá trị nếu trong phạm vi [0, 249] hoặc
sử dụng toán tử modulo để duy trì trong khoảng [0, 250 [, tôi nghĩ đây là giải pháp tốt nhất, mặc dù nó thay đổi một chút gaussian đường cong. Đây là truy vấn cuối cùng tôi đề nghị bạn sử dụng (thủ thuật modulo/+/modulo là vì -x modulo y với số dương xa cho số âm trong PostGreSQL, không phải là điều xấu: p):
SELECT ((floor(normal_rand(1,0,1)*250 + 125)::int % 250) + 250) % 250 as v;
Nguồn
2013-07-04 06:57:50
Tại sao bạn cho rằng mức độ phổ biến hoặc xếp hạng có phân phối Gaussion? – wildplasser
Bạn có thể tính toán bất kỳ phân phối nào bằng cách sử dụng tệp PDF của phân phối đó bằng cách sử dụng RAND (tạo giá trị giữa 0 và 1, phải không?). Đối với distro gaussian, đó sẽ là 1/2 (1 + erf (x-mu)/sqrt (2sigma^2)) - xem http://en.wikipedia.org/wiki/Normal_distribution –
@ wildplasser: vì luật đó có vẻ khá tốt cho những gì tôi cố gắng để mô hình. Tôi thừa nhận nó có thể đã được bất kỳ khác! – SCO