2009-04-15 52 views
10

Từ những gì tôi hiểu, trình tạo tiêu chuẩn dành cho Phân phối Bình thường. Tôi phải tạo các số ngẫu nhiên theo các Phân bố Bình thường, Đồng nhất và Poisson, nhưng dường như tôi không thể tìm thấy lớp học cho lần cuối 2.Máy phát Java cho Poisson và phân phối đồng đều?

Tôi phải tạo chúng trong khoảng 0 - 999999.

Trả lời

5

Thực ra, standard generator là để phân phối đồng đều. Trình tạo số ngẫu nhiên cơ bản trong bất kỳ ngôn ngữ/thư viện nào sẽ luôn luôn (trong mọi trường hợp tôi biết) sử dụng phân phối đồng đều vì đó là những gì xuất phát từ các thuật toán tạo số giả ngẫu nhiên phổ biến - về cơ bản, các số ngẫu nhiên đồng đều là dễ nhất.

tôi thấy Eddie đã chỉ bạn một liên kết cho các bản phân phối khác vì vậy tôi sẽ bỏ qua văn bản cho phần còn lại của này ...

+0

Thực ra, có vẻ như liên kết đó cũng chỉ ra phương pháp "nextGaussian" để tạo các biến thể bình thường. – gnovice

4

Hãy để tôi mở đầu tất cả điều này bởi thực tế là không ai trong số này là thực sự ngẫu nhiên, tôi đang nói về các trình tạo số ngẫu nhiên giả.

Hãy để tôi cũng nói rằng tôi chưa bao giờ phải làm điều này cho mã chất lượng sản xuất. Tôi đã làm điều này cho một nhiệm vụ hw mặc dù, trong Python. Tôi mô phỏng các biến ngẫu nhiên Poisson.

Cách mà tôi đã làm nó đã sử dụng các sự kiện sau đây:

  1. Một Poisson biến ngẫu nhiên là một tổng của các biến ngẫu nhiên mũ.
  2. Chúng ta có thể sử dụng phương pháp biến đổi nghịch đảo để tạo ra các biến ngẫu nhiên theo hàm mũ. http://en.wikipedia.org/wiki/Inverse_transform_sampling.

Đặc biệt, bạn có thể sử dụng thực tế là: nếu X , ..., X n là độc lập chuẩn biến ngẫu nhiên mũ, sau đó Z = min (k: X + ... + X k < & lambda;) - 1 là Poisson (& lambda;).

Vì vậy, với điều đó, tôi đã viết đoạn mã sau vào python để tạo ra giá trị Poisson:

class Poisson: 
    """Generate Poisson(lambda) values by using exponential 
    random variables.""" 

    def __init__(self, lam): 
     self.__lam = lam 

    def nextPoisson(self): 
     sum = 0 
     n = -1 
     while sum < self.__lam: 
      n += 1 
      sum -= math.log(random.random()) 
     return n 

Ví dụ sử dụng lớp là:

# Generates a random value that is Poisson(lambda = 5) distributed 
poisson = Poisson(5) 
poisson_value = poisson.nextPoisson 

Tôi đăng này ở đây vì nó là tốt để biết rằng các loại mối quan hệ này tồn tại và phương pháp biến đổi nghịch đảo này cung cấp cho bạn cách tổng quát để giải quyết việc tạo ra các giá trị ngẫu nhiên sau một phân bố liên tục cụ thể.

+0

Tôi đã sửa định dạng của danh sách được đánh số thành những gì tôi tin rằng bạn dự định. Nếu đây không phải là những gì bạn dự định, sau đó tất nhiên cảm thấy tự do để quay trở lại sự thay đổi. – Eddie

12

Như David đã chỉ ra, trình tạo số giả ngẫu nhiên được cung cấp sử dụng phân phối Đồng đều.

Đối với hai người kia, tôi sẽ sử dụng các chức năng Cern Colt thư viện:

Những chức năng thư viện dễ dàng cho phép bạn tìm thấy một số ngẫu nhiên lấy từ mỗi phân phối, thay vì cung cấp cho bạn hàm mật độ xác suất hoặc hàm mật độ tích lũy và mong bạn tự lấy được số đó (có vẻ như là phương pháp tiếp cận Apache Commons-Math):

RandomEngine engine = new DRand(); 
Poisson poisson = new Poisson(lambda, engine); 
int poissonObs = poisson.nextInt(); 

Normal normal = new Normal(mean, variance, engine); 
double normalObs = normal.nextDouble(); 

Ngoài ra, hãy nhớ rằng bản phân phối Poisson P (& lambda;) cho lớn & lambda; có thể xấp xỉ rất tốt bằng cách phân phối chuẩn N (& lambda ;, sqrt (& lambda;)).

+0

Có cách nào để chỉ định giá trị tối thiểu và tối đa mà chúng sử dụng không? Có vẻ như không, từ những gì tôi nhìn thấy. –

+0

Đó là bởi vì Poisson và phân phối bình thường không có tối đa hoặc tối thiểu (tốt, Poisson có tối thiểu cố định là 0). –

+0

thư viện rất đẹp, cảm ơn! – peq

6

RNG Java chuẩn (java.util.Random) và các lớp con của nó chẳng hạn như java.security.SecureRandom, đã tạo ra các giá trị được phân phối thống nhất.

Họ cũng có phương thức, nextGaussian, trả về giá trị được phân phối bình thường. Theo mặc định, phân phối có giá trị bằng 0 và độ lệch chuẩn là 1 nhưng điều này được chỉnh sửa một cách trivially. Chỉ cần nhân với s.d. và thêm giá trị yêu cầu. Vì vậy, ví dụ, nếu bạn muốn giá trị bình thường phân phối với trung bình của 6 và độ lệch chuẩn là 2.5, bạn muốn làm điều này:

double value = rng.nextGaussian() * 2.5 + 6; 

Sự phân bố Poisson không được hỗ trợ một cách rõ ràng, nhưng bạn có thể giả mạo nó bằng cách làm tương tự như Tom's Python code.

Hoặc, bạn có thể quan tâm đến số Uncommons Maths library, cung cấp các lớp tiện ích cho Bình thường, Poisson và các bản phân phối khác.

+0

Liên kết tới Uncommons là 404. –

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