2012-03-28 28 views
5

Phương pháp next của java.util.Random, khi tôi xem nguồn trong Eclipse, về cơ bản là:Việc triển khai java.util.Random có ​​khác nhau giữa các JRE hoặc nền tảng không?

seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); 
return (int)(seed >>> (48 - bits)); 

Làm thế nào tôi có thể xác định xem JDK khác nhau hoặc các JVM sẽ thực hiện next theo một cách khác hoặc với các hằng số khác nhau?

Tôi đã gặp các nhà thầu không có đối số khác nhau trong Weird behaviour when seeding Java Random. Tôi muốn biết nếu một điều tương tự có thể xảy ra với phương pháp next. Tôi có thể tìm nguồn để triển khai khác ở đâu?

+0

Nếu nó hoàn toàn có để được như vậy, tôi sẽ có được một bản sao của và sử dụng mã đó thay thế. Mặc dù tài liệu cho thấy điều này không cần thiết. –

Trả lời

5

Javadoc cho Random.next() nêu rõ thuật toán nào được sử dụng để tạo số tiếp theo. Về mặt lý thuyết có thể là một JVM khác có thể sử dụng một thuật toán khác, nhưng điều này là không chắc chắn, đặc biệt nếu bạn tự giới hạn mình với JVM dựa trên các thư viện Sun/Oracle.


Có tài liệu hướng dẫn cụ thể cần áp dụng đối với tất cả JDK?

Bạn cần phải kiểm tra để chắc chắn, nhưng có thể là có. Đây là loại điều mà Sun/Oracle không thể thay đổi vì tiềm năng phá vỡ nhiều ứng dụng Java hiện có và các bộ thử nghiệm được viết trong 15 hoặc nhiều năm qua.

Dưới đây là một số sự kiện:

  • javadoc cho Java 1.3.1 thông qua Java 1.7 (*) chứa các đặc điểm kỹ thuật chính xác tương tự cho phương pháp này,

  • một thực hiện chỉ được phép sử dụng nhãn hiệu "Java" nếu nó phù hợp với đặc điểm kỹ thuật

  • nhất (nếu không phải tất cả) triển khai Java (TM) sử dụng thư viện lớp có nguồn gốc từ mã nguồn Oracle/Sun,

  • nhà phát triển sẽ nhận thấy rằng một thuật toán khác đã được sử dụng ... và phàn nàn lớn tiếng.

Vì vậy, khả năng triển khai Java (TM) bằng thuật toán khác là khá nhỏ.

(* Tôi không thể tìm thấy Java 1.1 javadocs trực tuyến, nhưng tôi hy vọng rằng họ sẽ nói điều tương tự.)

+0

Tôi nghĩ rằng hợp đồng có thể là một tổng quát hơn 'tạo ra một số ngẫu nhiên ...' và do đó thay đổi để thực hiện về mặt lý thuyết sẽ được phép mà không vi phạm bất cứ điều gì. – Flash

+0

@Andrew - đừng giả sử. Đọc javadocs. –

4

Làm cách nào để xác định xem các JDK hoặc JVM khác nhau sẽ triển khai tiếp theo theo cách khác hoặc với các hằng số khác nhau?

Bằng việc sử dụng hạt giống trong một chương trình trên JVM khác nhau và nhìn thấy nếu bạn nhận được cùng một chuỗi, như chuỗi là xác định cho một hạt giống nhất định.

Tôi không chắc chắn JDK được phép sử dụng một thuật toán khác nhau, tuy nhiên, như documentation for next nói:

Phương pháp next được thực hiện bởi lớp Random bởi nguyên tử cập nhật các hạt giống để

(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)

và trở

(int)(seed >>> (48 - bits)).

Đây là một congruential tạo số giả ngẫu tuyến tính, theo định nghĩa của D. H. Lehmer và được mô tả bởi Donald E. Knuth trong The Art of Computer Programming, Tập 3: Seminumerical Algorithms, phần 3.2.1.

... mà dường như để thiết lập một hợp đồng cụ thể, mặc dù ngay trước đó nó nói

Hợp đồng chung của next là nó trả về một giá trị int và nếu đối số bits là giữa 132 (bao gồm), khi đó nhiều bit có thứ tự thấp của giá trị trả lại sẽ là (xấp xỉ) giá trị bit được chọn độc lập, mỗi giá trị là (xấp xỉ) có khả năng là 0 hoặc 1.

... vì vậy có lẽ điều đó cho phép phòng lung linh trên thuật toán.

Tôi có thể tìm nguồn để triển khai khác ở đâu?

Nếu chúng là nguồn mở, có lẽ bạn có thể tìm thấy việc triển khai trong kho lưu trữ của dự án. Nếu họ đóng cửa, thì ...

+0

Tài liệu đó có nhất thiết áp dụng cho tất cả các JDK không? – Flash

+0

@ Andrew: Tài liệu được liên kết là tài liệu chính thức cho Java 7 SE, không phải là một JDK cụ thể. Vì vậy, có, nó áp dụng cho tất cả các JDK phù hợp. Một JDK khác với tài liệu chính thức không phù hợp. –

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