2010-08-18 52 views
14

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

+2

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

+0

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í? –

+0

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

Trả lời

15

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.

+0

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ó? –

+0

+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

+0

@ 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. –

3

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

9

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.

Code for this is here

+0

Bạn đang giả định phân phối là rời rạc. – pjs

+0

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

+1

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

0

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

Các vấn đề liên quan