2013-01-20 12 views
21

Trong Java, chúng tôi có Toán lớp tĩnh. Bạn không cần phải tạo các đối tượng của nó để tĩnh của nó. Một lớp khác là lớp Random. Chúng ta không cần tạo ra các thể hiện của nó, vậy tại sao nó không phải là tĩnh? Các lớp học của tôi, tôi thường sử dụng các mẩu ngẫu nhiên và phát điên khi phải tạo ra các trường trong mỗi lớp để tạo ra các số ngẫu nhiên. Vậy tại sao nó không tĩnh?Tại sao lớp Random không tĩnh?

+9

Um, các lớp cấp cao nhất trong Java không thể được khai báo là tĩnh và bạn * cần * cần tạo các trường hợp 'Random'. Cả hai cơ sở của câu hỏi của bạn là không chính xác, về cơ bản. –

+0

Lớp =/= phương pháp. –

+0

Có một phép tính ngẫu nhiên tĩnh() trong môn Toán. – josefx

Trả lời

24

Lớp Random có ​​trạng thái, bao gồm vị trí của nó, vì các giá trị được tạo ra không thực sự ngẫu nhiên, chỉ là một chuỗi giả ngẫu nhiên.

Điều này có thể được chứng minh bằng cách khởi tạo hai trường hợp với cùng một hạt giống.

Random a = new Random(123); 
Random b = new Random(123); 
for (int i = 0; i < 5; i++) { 
    System.out.println(a.nextInt() + "," + b.nextInt()); 
} 

Output

-1188957731,-1188957731 
1018954901,1018954901 
-39088943,-39088943 
1295249578,1295249578 
1087885590,1087885590 

Nếu bạn tạo với constructor mặc định ngẫu nhiên(), sau đó hạt giống được khởi tạo dựa trên thời gian hiện tại trong nano giây + một bộ đếm tĩnh, có nghĩa là các trường hợp khác nhau rất có khả năng có các trình tự khác nhau.

+1

* Nếu bạn tạo với hàm tạo mặc định Random(), thì hạt giống được khởi tạo với thời gian hiện tại tính bằng mili giây * - điều này là không chính xác, việc tạo hạt ngay cả đối với mặc định 'new Random()' phức tạp hơn chỉ là 'System .currentTimeMillis() ' – bestsss

+0

@bestsss Xin lỗi, bạn đã đúng. Tôi đã xem xét một số nguồn rất cũ cho java.util.Random (một trong những trận đấu đầu tiên trên google khó chịu). Sử dụng System.currentTimeMillis() từng là hành vi trước 1.5, nhưng bây giờ như bạn nói, phức tạp hơn nhiều. – Adam

+0

Có, nó đã được thay đổi trong 1,5, nó đã thực sự millisec chỉ (khá lame) – bestsss

13

Bạn do cần tạo phiên bản, vì trình tạo số ngẫu nhiên có trạng thái . Cụ thể, trạng thái điều khiển vị trí hiện tại trong chuỗi giả ngẫu nhiên.

Nếu bạn muốn nhiều trình tạo độc lập (không chia sẻ trạng thái), thì bạn cần các phiên bản riêng biệt.

4

Lý do là bạn có thể yêu cầu một số trình tạo số ngẫu nhiên độc lập. Điều này đạt được bằng cách có một số phiên bản Random.

5

Đó là tất cả về hạt giống. Như bạn biết, chúng tôi không nói về các số ngẫu nhiên thực mà là giả ngẫu nhiên. Khi bạn biết số đầu tiên bạn có thể tính toán số khác. Đây là lý do tại sao chúng ta sử dụng cái gì đó được gọi là 'một hạt giống'. Mỗi đối tượng của Random có hạt giống khác nhau. Nếu Random sẽ tĩnh, bạn không thể có hai hạt giống khác nhau. Lưu ý rằng phương thức setSeed() sau đó sẽ ảnh hưởng đến tất cả các trình tạo số ngẫu nhiên (và chúng tôi thường chỉ muốn thay đổi một).

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