2010-08-27 31 views
5

Tham chiếu: link textsố ngẫu nhiên với hạt giống

Tôi không thể hiểu dòng sau, ai cũng có thể cung cấp cho tôi một số ví dụ cho tuyên bố dưới đây?

Nếu hai trường hợp ngẫu nhiên được tạo ra với các hạt giống nhau, và cùng một chuỗi của phương pháp các cuộc gọi được thực hiện cho mỗi, họ sẽ tạo ra và trở về trình tự giống hệt nhau của số

+0

Theo sau tuyên bố đó khá đơn giản. 'Ngẫu nhiên r1, r2', tạo và khởi tạo với cùng một hạt giống (xem tài liệu). Gọi 'next' 5 lần trên mỗi lần. Chúng sẽ trả về cùng một chuỗi 5 số ngẫu nhiên chính xác. – polygenelubricants

Trả lời

11

Kể từ khi bạn yêu cầu một ví dụ:

import java.util.Random; 
public class RandomTest { 
    public static void main(String[] s) { 
     Random rnd1 = new Random(42); 
     Random rnd2 = new Random(42); 

     System.out.println(rnd1.nextInt(100)+" - "+rnd2.nextInt(100)); 
     System.out.println(rnd1.nextInt()+" - "+rnd2.nextInt()); 
     System.out.println(rnd1.nextDouble()+" - "+rnd2.nextDouble()); 
     System.out.println(rnd1.nextLong()+" - "+rnd2.nextLong()); 
    } 
} 

Cả Random trường sẽ luôn luôn có đầu ra tương tự, bất kể mức độ thường xuyên bạn chạy nó, không có vấn đề gì nền tảng hoặc những gì phiên bản Java bạn sử dụng:

30 - 30 
234785527 - 234785527 
0.6832234717598454 - 0.6832234717598454 
5694868678511409995 - 5694868678511409995 
8

Các máy phát điện ngẫu nhiên là xác định. Với cùng một đầu vào Random và cùng sử dụng các phương thức trong Random, chuỗi các số giả ngẫu nhiên được trả về cho chương trình của bạn sẽ giống nhau ngay cả trong các lần chạy khác nhau trên các máy khác nhau.

Đây là lý do tại sao nó là giả ngẫu nhiên - số được trả lại hành xử thống kê giống như số ngẫu nhiên ngoại trừ chúng có thể được dự đoán một cách đáng tin cậy. Số ngẫu nhiên thực là không thể đoán trước.

2

Các số không thực sự ngẫu nhiên, với cùng điều kiện bắt đầu (hạt giống) và cùng một chuỗi hoạt động, cùng một dãy số sẽ được tạo. Đây là lý do tại sao nó không phải là tốt để sử dụng các lớp ngẫu nhiên cơ bản như một phần của bất kỳ mã cryptograhic hoặc bảo mật liên quan vì nó có thể có thể cho một kẻ tấn công để tìm ra sequnce đang được tạo ra và dự đoán số tương lai.

Đối với trình tạo số ngẫu nhiên phát ra các giá trị không xác định, hãy xem SecureRandom.

Xem Random number generation, Computational methods trên wikipedia để biết thêm thông tin.

0

Với cùng giá trị hạt giống, các trường hợp ngẫu nhiên riêng biệt sẽ trả về/tạo cùng một chuỗi các số ngẫu nhiên; hơn về vấn đề này ở đây: http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Tech/Chapter04/javaRandNums.html

của Ruby Ví dụ:

class LCG; def initialize(seed=Time.now.to_i, a=2416, b=374441, m=1771075); @x, @a, @b, @m = seed % m, a, b, m; end; def next(); @x = (@a * @x + @b) % @m; end; end 

irb(main):004:0> time = Time.now.to_i 
=> 1282908389 

irb(main):005:0> r = LCG.new(time) 
=> #<LCG:0x0000010094f578 @x=650089, @a=2416, @b=374441, @m=1771075> 
irb(main):006:0> r.next 
=> 45940 
irb(main):007:0> r.next 
=> 1558831 
irb(main):008:0> r.next 
=> 1204687 
irb(main):009:0> f = LCG.new(time) 
=> #<LCG:0x0000010084cb28 @x=650089, @a=2416, @b=374441, @m=1771075> 
irb(main):010:0> f.next 
=> 45940 
irb(main):011:0> f.next 
=> 1558831 
irb(main):012:0> f.next 
=> 1204687 

Dựa trên các giá trị a/b/m, kết quả sẽ là như nhau đối với một hạt giống nhất định. Điều này có thể được sử dụng để tạo ra cùng một "ngẫu nhiên" số ở hai nơi và cả hai bên có thể phụ thuộc vào nhận được kết quả tương tự. Điều này có thể hữu ích cho việc mã hóa; mặc dù rõ ràng, thuật toán này không an toàn về mặt mã hóa.

3

Lớp ngẫu nhiên về cơ bản là một Psuedorandom Số Generator (còn gọi là xác định phát bit ngẫu nhiên) mà tạo ra một chuỗi các con số mà xấp xỉ với tính chất của số ngẫu nhiên. Nó không phải là ngẫu nhiên nhưng xác định vì nó có thể được xác định bởi các trạng thái ngẫu nhiên nhỏ trong máy phát điện (chẳng hạn như seed). Do tính chất xác định, bạn có thể tạo ra kết quả giống nhau nếu bạn trình tự các phương thức và hạt giống giống nhau trên 2 máy phát.

1

Điều này có nghĩa là khi bạn tạo đối tượng Ngẫu nhiên (ví dụ như khi bắt đầu chương trình của bạn), có thể bạn sẽ muốn bắt đầu bằng một hạt giống mới.Hầu hết mọi người chọn một số giá trị liên quan đến thời gian, chẳng hạn như số lượng bọ ve.

Thực tế là các chuỗi số giống nhau cho cùng một hạt giống thực sự rất thuận tiện nếu bạn muốn gỡ lỗi chương trình của mình: đảm bảo bạn đăng nhập giá trị hạt giống và nếu có điều gì sai, bạn có thể khởi động lại chương trình trong trình gỡ lỗi bằng cùng giá trị hạt giống. Điều này có nghĩa là bạn có thể phát lại chính xác kịch bản. Điều này sẽ là không thể nếu bạn (có thể) sử dụng một bộ tạo số ngẫu nhiên thực sự.

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