2016-02-17 20 views
5

tôi đã viết chương trình mô phỏng roll diceTrình tạo ngẫu nhiên Java hoạt động như thế nào?

Random r = new Random(); 
    int result = r.nextInt(6); 
    System.out.println(result); 

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?

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?

+1

Đó 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

+0

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

+1

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 –

Trả lời

12

Chúng là số giả ngẫu nhiên, có nghĩa là cho mục đích chung và mục đích, chúng đủ ngẫu nhiên. Tuy nhiên chúng là xác định và hoàn toàn phụ thuộc vào hạt giống. Đoạn mã sau sẽ in ra 10 số giống nhau hai lần.

Random rnd = new Random(1234); 
for(int i = 0;i < 10; i++) 
    System.out.println(rnd.nextInt(100)); 

rnd = new Random(1234); 
for(int i = 0;i < 10; i++) 
    System.out.println(rnd.nextInt(100)); 

Nếu bạn có thể chọn hạt giống, trước tiên bạn có thể tính toán số trước, sau đó đặt lại máy phát với cùng hạt giống và bạn sẽ biết trước số nào xuất hiện.

1

Có, có thể dự đoán số máy phát điện số ngẫu nhiên sẽ tạo ra tiếp theo. Tôi đã nhìn thấy điều này được gọi là nứt, phá vỡ, hoặc tấn công RNG. Tìm kiếm bất kỳ thuật ngữ nào trong số các thuật ngữ đó cùng với "trình tạo số ngẫu nhiên" sẽ bật lên nhiều kết quả.

Đọc How We Learned to Cheat at Online Poker: A Study in Software Security để có tài khoản thật tuyệt vời về cách một trình tạo số ngẫu nhiên có thể bị tấn công. Tóm lại, các tác giả đã tìm ra những gì RNG đã được sử dụng dựa trên một thuật toán xáo trộn lỗi được sử dụng bởi một trang web poker trực tuyến. Sau đó, họ đã tìm ra hạt giống RNG bằng cách lấy mẫu tay đã được xử lý. Một khi họ đã có thuật toán và hạt giống, họ biết chính xác boong tàu sẽ được bố trí như thế nào sau những lần xáo trộn sau này.

Bạn cũng có thể tham khảo điều này link.

1

Kiểm tra How does java.util.Random work and how good is it:

Nói cách khác, chúng ta bắt đầu với một số bắt đầu hoặc "hạt giống" số mà lý tưởng là "thực sự không thể đoán trước", và đó trong thực tế là "đủ khó lường". Ví dụ: số mili giây— hoặc thậm chí là nano giây— kể từ khi máy tính được bật có sẵn trên hầu hết các hệ thống. Sau đó, mỗi lần chúng ta muốn một số ngẫu nhiên, chúng ta nhân các hạt giống hiện tại với một số cố định, thêm một số cố định khác, c, rồi lấy kết quả modulo một số cố định khác, m. Số a là thường lớn. Phương pháp tạo số ngẫu nhiên này quay trở lại khá nhiều vào buổi bình minh của máy tính1. Khá nhiều bộ tạo số ngẫu nhiên "bình thường" mà bạn có thể nghĩ đến— từ máy tính số khoa học đến máy tính gia đình 1980 vào ngày hiện tại C và Visual Basic chức năng thư viện— sử dụng một số biến thể của công thức trên để tạo ra số ngẫu nhiên của nó.

Và cũng Predicting the next Math.random() in Java

8

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.

+0

Bạn có ý nghĩa gì bởi trạng thái hiện tại? Và là trạng thái trước đó đã được cứu - nếu vậy thì sao? – Lealo

+0

1) Các giá trị của các biến cá thể của máy phát (riêng). Nhìn vào mã nguồn. 2) AFAIK, Không. –

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