2010-10-10 53 views
5

Tôi muốn tạo một số số nguyên ngẫu nhiên trong Java, nhưng điều này theo một số luật phân phối. Cụ thể hơn:Trình tạo số ngẫu nhiên tạo số nguyên cho Java

  • Tôi muốn tạo một số số nguyên ngẫu nhiên để phân phối gaussian. Tôi chỉ phát hiện ra các máy phát trả lại kết quả kép cho phân phối gaussian. Tại sao vậy?

  • Tôi muốn tạo một số số nguyên ngẫu nhiên giữa một số giới hạn cho phân phối theo cấp số mũ? Ở đây tôi cũng phát hiện ra chỉ về máy phát điện mà trả lại gấp đôi. Tôi cũng không tìm ra cách để tạo ra một số số mũ ngẫu nhiên chỉ giữa hai giới hạn.

Bạn có thể giúp tôi không? Bạn có biết một thư viện có thể làm những gì tôi muốn không? Tôi đã nghiên cứu thư viện của Michael Flanagan, colt và Commons's Commons Math nhưng họ không có những gì tôi cần.

Cảm ơn!

Trả lời

-1

Chỉ cần tạo gấp đôi và chia tỷ lệ nó thành phạm vi số nguyên bạn yêu cầu. Ví dụ: nếu trình tạo số ngẫu nhiên thường xuyên (thống nhất) tạo số từ 0,0 đến 1,0 và bạn muốn số từ 0 đến 100, bạn chỉ cần nhân số ngẫu nhiên được tạo cho 100.

+2

nhưng vẫn sẽ được phân phối thống nhất thay vì Gaussian. –

+0

có ìff bộ tạo đôi được phân phối đồng đều, iff nó có phân phối gaussian, dãy số nguyên sẽ có phân phối gaussian. – flownt

+0

Tại sao lại là downvote? OP cho biết họ có một bộ tạo số ngẫu nhiên Gaussian. Tôi đã chỉ ra rằng số lượng có thể được dịch từ một phân phối Gaussian khác. Tôi không thể nhớ toán học, nhưng đó là một sự biến đổi đơn giản. – dty

2

Nếu bạn có số kép 0 đến 1 bạn có thể chia tỷ lệ thành số nguyên:

int res = lowLimit + (int) (myRandFunction() * (highLimit - lowLimit));

Edit:

Tại sao tôi nhận được một cuộc bỏ phiếu xuống? Anh ấy buồn vì anh ta có một chức năng trả về gấp đôi phân phối mà anh ta muốn (tôi đoán là một dạng gấp đôi từ 0 đến 1), vì vậy điều này sẽ thực hiện công việc.

+0

Làm thế nào là gaussian này hoặc phân bổ theo cấp số nhân? LƯU Ý: Tôi không phải là người downvoter. –

+0

nếu hàm myRandFunction() trả về các số trong phân phối gaussian từ 0 đến 1, điều này sẽ trả về các số nguyên phân tán gaussian. – Klark

+0

(cũng không giảm) Không có những thứ như số nguyên phân tán gaussian. Gaussian (bình thường) phân phối chỉ hợp lệ trong bối cảnh của các phạm vi liên tục. Sự phân bố rời rạc tương tự nhất là nhị thức. – Rekin

-1

boost có một số trình tạo số ngẫu nhiên thực sự tốt đẹp, tôi biết C++ của nó chứ không phải java, nhưng việc triển khai phải là hướng dẫn tốt để triển khai chúng.

http://www.boost.org/doc/libs/1_43_0/doc/html/boost_random.html

+0

tại sao tất cả các câu trả lời đều bị bỏ phiếu? – flownt

+1

Tôi đã không làm điều đó, nhưng tôi nghĩ nó bởi vì không ai trong số họ thực sự trả lời câu hỏi. –

+0

@Colin Hebert, không khó để làm điều đó cho mình khoảng gaussian: rand()/4 + rand()/4 + rand()/4 + rand()/4 do phân phối nhị thức xấp xỉ với phân bố chuẩn, điều này sẽ tạo ra một phân phối nhị thức giữa 0 và đầu ra tối đa của rand() – flownt

3

tôi đề nghị bạn sử dụng Uncommons Maths thư viện, trong đó bao gồm máy phát điện khác nhau ngẫu nhiên (ví dụ Mersenne Twister, AES-based) và phân phối (Poisson, gaussian và vân vân)

Đối với " vấn đề kép ": gần như tất cả các máy phát ngẫu nhiên tạo ra gấp đôi vì chúng được sử dụng nhiều nhất. Nếu bạn cần số nguyên, bạn sẽ cần phải làm tròn cho mình (một cuộc gọi đến Math.round sẽ là đủ). Giả sử bạn đang tạo ra chiều cao người ngẫu nhiên với độ chính xác centimet: nếu máy phát ngẫu nhiên của bạn trả về 175.234, bạn chỉ có thể làm tròn nó thành 175. Đó thực sự không phải là vấn đề.

Đối với giới hạn phân phối mũ: không có máy phát nào cho phép bạn chọn giới hạn vì không có giới hạn nào tồn tại cho phân phối theo cấp số mũ. Phân phối theo hàm mũ thường mô hình độ trễ giữa hai sự kiện liên tiếp trong quá trình Poisson: độ trễ có thể thấp đến 0 hoặc có thể cực kỳ cao. Kết quả cực kỳ cao thực sự không chắc chắn, nhưng chúng không phải là không thể. bạn có thể giải quyết vấn đề bằng cách lấy một số ngẫu nhiên từ máy phát, thêm giới hạn dưới của bạn và sử dụng Math.max để cắt nó nếu nó cao hơn giới hạn trên của bạn. Nhưng điều này không còn là phân phối theo cấp số nhân.