2012-02-05 9 views
13

Tôi cần tạo chuỗi số giả ngẫu nhiên được kiểm soát, được cung cấp thông số nguyên ban đầu. Cho rằng tôi đang sử dụng lớp Java Random chuẩn, được gieo bởi một tham số nguyên. Tôi muốn đảm bảo rằng tôi sẽ tạo ra cùng một chuỗi trên các hệ thống (Hệ điều hành, nhưng cũng là phiên bản Java/JDK), trong tương lai gần (và nhiều hơn nữa!).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?

Tóm lại: Có Java đảm bảo sự lặp lại/tính di động của nó là bộ tạo số giả ngẫu nhiên trên thực hiệnphiên bản?

Lưu ý: Tôi đã hỏi the exact same question for Python. Kể từ khi tôi thay đổi ngôn ngữ triển khai sang Java nhưng vì những lý do khác.

+1

sẽ miễn là bạn không sử dụng lại cùng một trình tạo từ nhiều chuỗi. Bây giờ không nhận được bình luận này sai: chính máy phát là an toàn, nhưng nếu bạn đang tạo ra các số từ các luồng khác nhau bằng cách sử dụng cùng một trình tạo, bạn sẽ không thể tái tạo các cuộc gọi từ các luồng khác nhau của bạn một cách chính xác đặt hàng trên các hệ thống khác nhau (thậm chí không phải trên các lần chạy khác nhau trên cùng một hệ thống). – TacticalCoder

+0

Đó sẽ không phải là trường hợp, nhưng cảm ơn cho tip. Vâng, để được chính xác, bạn có thể tái sản xuất cùng một trình tự trong một số chủ đề bằng cách sử dụng một cơ chế khóa thích hợp, nhưng tôi đồng ý với bạn đó là yêu cầu cho sự cố. –

Trả lời

14

Có.

Các javadoc giải thích:

Một thể hiện của lớp này được sử dụng để tạo ra một dòng số giả ngẫu nhiên. Lớp này sử dụng một hạt giống 48-bit, được sửa đổi bằng cách sử dụng một công thức tuyến tính tuyến tính. (Xem Donald Knuth, Nghệ thuật Lập trình Máy tính, Tập 2, Mục 3.2.1.)

Nếu hai trường hợp Random được tạo với cùng một hạt giống và cùng một chuỗi các cuộc gọi phương thức được thực hiện cho mỗi hạt giống, chúng sẽ tạo và trả về các chuỗi số giống hệt nhau. Để đảm bảo thuộc tính này, các thuật toán cụ thể được chỉ định cho lớp Random. Việc triển khai Java phải sử dụng tất cả các thuật toán được hiển thị ở đây cho class Random, vì lợi ích của tính di động tuyệt đối của mã Java. Tuy nhiên, các lớp con của class Random được phép sử dụng các thuật toán khác, miễn là chúng tuân thủ các hợp đồng chung cho tất cả các phương pháp.