Tôi muốn tạo các số ngẫu nhiên theo một số bản phân phối. Tôi có thể làm cái này như thế nào?Tạo các số ngẫu nhiên theo các bản phân phối
Trả lời
Trình tạo số ngẫu nhiên chuẩn mà bạn đã có (rand()
trong C sau một phép biến đổi đơn giản, tương đương bằng nhiều ngôn ngữ) là xấp xỉ gần đúng với phân bố đồng đều trên phạm vi [0,1]. Nếu đó là những gì bạn cần, bạn đã hoàn tất. Nó cũng tầm thường để chuyển đổi nó thành một số ngẫu nhiên được tạo ra trên một phạm vi số nguyên lớn hơn một chút.
Chuyển đổi phân phối Đồng đều sang phân phối Bình thường có already been covered on SO, như đã đi tới Exponential distribution.
[EDIT]: Đối với triangular distribution, chuyển đổi một biến thống nhất là tương đối đơn giản (trong một cái gì đó C-like):
double triangular(double a,double b,double c) {
double U = rand()/(double) RAND_MAX;
double F = (c - a)/(b - a);
if (U <= F)
return a + sqrt(U * (b - a) * (c - a));
else
return b - sqrt((1 - U) * (b - a) * (b - c));
}
Đó chỉ là chuyển đổi các công thức đưa ra trên trang Wikipedia. Nếu bạn muốn người khác, đó là nơi để bắt đầu tìm kiếm; nói chung, bạn sử dụng biến thống nhất để chọn một điểm trên trục dọc của cumulative density function của phân phối bạn muốn (giả sử nó liên tục) và đảo ngược CDF để nhận giá trị ngẫu nhiên với phân phối mong muốn.
không có tôi chỉ cần có một số con số trong mũ, bình thường, tam giác ... vv? Rockwell Arena phân tích đầu vào hiện điều này nhưng tôi không biết làm thế nào để sử dụng nó? –
+1 Tôi đánh giá cao mã giả C này, bởi vì tôi đang xem bài viết của wikipedia về phân phối hình tam giác và không thể tìm ra cách biến nó thành mã. Một sửa chữa: rand() trả về một số nguyên từ 0 đến RAND_MAX, vì vậy tôi nghĩ bạn muốn 'U = ((double) rand())/RAND_MAX'. Nếu không, sqrt của bạn ((1 - U) ...) sẽ đi ra tưởng tượng. – LarsH
@ LarsH: Chết tiệt! Quên rằng C là lẻ theo cách đó. Cảm ơn vì sự đúng đắn của bạn. –
Nó thực sự phụ thuộc vào phân phối. Cách tổng quát nhất là như sau. Gọi P (X) là xác suất mà số ngẫu nhiên được tạo theo phân phối của bạn nhỏ hơn X.
Bạn bắt đầu tạo ngẫu nhiên X ngẫu nhiên giữa 0 và 1. Sau đó bạn tìm thấy Y sao cho P (Y) = X và đầu ra Y. Bạn có thể tìm Y như vậy bằng cách sử dụng tìm kiếm nhị phân (vì P (X) là hàm tăng của X).
Điều này không hiệu quả lắm, nhưng hoạt động đối với các bản phân phối trong đó P (X) có thể được tính toán hiệu quả.
Bạn có thể tra cứu nghịch đảo lấy mẫu, từ chối lấy mẫu cũng như các cuốn sách của Devroye "Nonuniform random variate generation"/Springer Verlag 1986
Cách đúng để làm điều này là để phân hủy các phân phối vào n-1 phân phối nhị phân. Đó là nếu bạn có một phân phối như thế này:
A: 0.05
B: 0.10
C: 0.10
D: 0.20
E: 0.55
Bạn biến nó thành 4 phân phối nhị phân:
1. A/E: 0.20/0.80
2. B/E: 0.40/0.60
3. C/E: 0.40/0.60
4. D/E: 0.80/0.20
Chọn thống nhất từ các bản phân phối n-1, và sau đó chọn biểu tượng đầu tiên hoặc thứ hai dựa về xác suất nếu mỗi trong phân phối nhị phân.
Bạn đang giả định phân phối là rời rạc. – pjs
Tôi chắc chắn sáng - đó là trường hợp điển hình trong lập trình (ví dụ: bảng chuyển đổi xác suất, mô hình markov ẩn, v.v ...). Nhưng nếu bạn nhận thấy phương pháp là * thời gian cố định *. Điều này có nghĩa là không có thời gian thực hiện hình phạt cho generting phân phối rất lớn. Vì vậy, đối với một bản phân phối liên tục, bạn có thể ghi rõ nó thành nhiều thùng như bạn cần để có được một xấp xỉ đủ tốt và sử dụng phương pháp của tôi. –
RV rời rạc có thể là phổ biến nhất trong các loại lập trình bạn làm, nhưng rất nhiều người trong chúng ta cần Gaussian, số mũ, tam giác, log-normal, beta, gamma, Weibull, vv, vv phân phối cho công việc của chúng tôi. Ngay cả với các bản phân phối riêng biệt, chúng không hoạt động cho các phạm vi vô hạn (Poisson, hình học). Bảng bí danh tạo ra các giá trị theo thời gian không đổi nhưng do đó, hầu hết các bản in hoặc thành phần liên tục. Trong khi đó, xấp xỉ các bản phân phối liên tục với các bảng có thiết lập và lưu trữ lớn không cần thiết bởi các phương pháp tính toán. Bảng bí danh rất đáng yêu khi áp dụng, nhưng chúng không phải là giải pháp chung. – pjs
Bạn có thể chuyển đổi từ thùng rời rạc nổi/đôi với suy. Tuyến tính đơn giản hoạt động tốt. Nếu bộ nhớ bảng của bạn bị hạn chế, các phương thức nội suy khác có thể được sử dụng. -jlp
- 1. Trình tạo số ngẫu nhiên phân phối ngẫu nhiên
- 2. Phân phối số ngẫu nhiên thế hệ
- 3. Số ngẫu nhiên từ bản phân phối Beta, C++
- 4. Trình tạo số giả ngẫu nhiên - Phân phối số mũ
- 5. Trình tạo số ngẫu nhiên có phân phối beta
- 6. phát sinh số ngẫu nhiên được phân phối đồng đều
- 7. Bias trong ngẫu nhiên số phân phối bình thường (javascript)
- 8. phân phối ngẫu nhiên Gaussian trong PostgreSQL
- 9. PHP: số ngẫu nhiên từ một phân phối chuẩn
- 10. Tạo một dãy các số ngẫu nhiên
- 11. Tạo Số ngẫu nhiên Dựa trên Phân phối Beta bằng cách sử dụng Boost
- 12. Trình tạo số ngẫu nhiên tạo số nguyên cho Java
- 13. Hiểu phân bố Poisson của trình tạo số ngẫu nhiên
- 14. Tạo số ngẫu nhiên lognormal trong MATLAB?
- 15. Điều gì sẽ xảy ra khi bạn sao chép công cụ số ngẫu nhiên và phân phối số ngẫu nhiên?
- 16. Phân tích số ngẫu nhiên
- 17. Các chữ số thập phân an toàn ngẫu nhiên chỉ
- 18. Tạo số ngẫu nhiên không đồng nhất
- 19. Tạo số ngẫu nhiên giữa 0 và 1 với phân phối gaussian
- 20. Tạo số ngẫu nhiên 2^30
- 21. Phân phối ngẫu nhiên (Monte-Carlo) trên quả cầu đơn
- 22. Tạo số ngẫu nhiên lớn
- 23. Mẫu ngẫu nhiên từ phân phối riêng biệt bivariate
- 24. cách tạo một số các số thập phân ngẫu nhiên giữa 0 và 1
- 25. Tạo số ngẫu nhiên CUDA
- 26. Làm cách nào để tạo số ngẫu nhiên bằng Python?
- 27. Xác định số ngẫu nhiên trên các hệ thống
- 28. Tái tạo các số giả ngẫu nhiên trên các hệ thống và phiên bản java?
- 29. tạo các số nguyên ngẫu nhiên với xác suất
- 30. Python: tạo phân bố liên tục (loại Maxwell-Boltzmann) để tạo các giá trị ngẫu nhiên
Bỏ qua thực tế là các máy tính chỉ tạo ra các số giả ngẫu nhiên, chắc chắn nếu chúng được tạo ra cho một phân bố đã biết thì chúng không ngẫu nhiên chút nào. Bạn đang tìm cách tạo các bản phân phối nào để tạo dữ liệu mẫu? – Lazarus
Cách dễ nhất là tìm thư viện thực hiện việc này. Bạn có bất kỳ ngôn ngữ cụ thể trong tâm trí? –
Nếu bạn sử dụng Java, bạn có thể thử [Thư viện toán học không phổ biến bởi Dan Dyer] (http://maths.uncommons.org/) (* chú ý nhận xét trước *) cung cấp trình tạo số ngẫu nhiên, phân phối xác suất, tổ hợp và thống kê . – hengxin