Tôi muốn biết nếu có một cách để "dự đoán" số tiếp theo được tạo ra và làm thế nào JVM xác định những gì số để tạo ra tiếp theo?
Tuyệt đối. Lớp Random
được triển khai như một bộ tạo số đồng phân tuyến tính (LCNG).Công thức chung của một máy phát điện congruential tuyến tính là:
new_state = (old_state * C1 + C2) modulo N
Thuật toán chính xác được sử dụng bởi Random
được quy định trong javadocs. Nếu bạn biết trạng thái hiện tại của bộ tạo, trạng thái tiếp theo là hoàn toàn có thể dự đoán được.
Số đầu ra mã của tôi có gần với ngẫu nhiên thực tại bất kỳ JVM và OS nào không?
Nếu bạn sử dụng Random
, thì không. Không dành cho bất kỳ JVM nào trên bất kỳ hệ điều hành nào.
Trình tự do LCNG tạo ra chắc chắn không phải ngẫu nhiên và có các thuộc tính thống kê khác biệt đáng kể so với chuỗi ngẫu nhiên thực sự. (Trình tự sẽ được tương quan tự động mạnh mẽ và điều này sẽ hiển thị nếu bạn vẽ kết quả của các cuộc gọi liên tiếp tới Random.nextInt()
.)
Đây có phải là sự cố không? Vâng nó phụ thuộc vào những gì ứng dụng của bạn cần. Nếu bạn cần số "ngẫu nhiên" khó dự đoán (ví dụ: đối với thuật toán có liên quan đến bảo mật), thì rõ ràng là không. Và nếu các con số sẽ được sử dụng cho một mô phỏng Monte Carlo, thì sự tương quan tự động inate của LCNG có thể bóp méo mô phỏng. Nhưng nếu bạn chỉ là xây dựng một trò chơi thẻ solitaire ... nó có thể không quan trọng.
Nguồn
2016-02-17 11:56:16
Đó thực sự là giả ngẫu nhiên. Điều này có nghĩa là chúng không thực sự ngẫu nhiên. Chỉ cần sử dụng cùng một hạt giống mỗi lần và các con số sẽ luôn giống nhau. Tại sao? Bạn đang cố gắng gây ấn tượng với một người nào đó có khả năng dự đoán tương lai? : P – Arc676
Tại sao bạn không chỉ đọc tài liệu? https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#next-int- – the8472
Bạn có thể thấy điều thú vị là bạn có thể làm gì với hạt giống ngẫu nhiên lựa chọn. http://vanillajava.blogspot.co.uk/2011/10/randomly-no-so-random.html –