2011-01-13 38 views
23

Tôi cần thực hiện một số thử nghiệm khi tôi sử dụng trình tạo số ngẫu nhiên randn giả ngẫu nhiên. Làm thế nào tôi có thể thiết lập hạt giống của riêng tôi, vì vậy mỗi khi tôi chạy thử nghiệm này, tôi sẽ nhận được kết quả tương tự? (vâng, tôi biết đó là một chút kỳ lạ, nhưng đó là vấn đề).Cách đặt hạt giống tùy chỉnh cho trình tạo số giả ngẫu nhiên

Tôi đã tìm thấy đối tượng RANDSTREAM có thuộc tính seed nhưng chỉ đọc. Có cách nào để sử dụng nó cho gieo hạt máy phát điện?

+6

Không, điều đó không lạ. Nó thực sự khá quan trọng để thử nghiệm và gỡ lỗi. – Jonas

+0

@ Jonas, yup, đặc biệt là khi nói đến độ lặp lại của kết quả ... – Gacek

+0

Lưu ý rằng để làm điều ngược lại, tức là để tránh lặp lại mỗi khi chúng ta khởi động lại Matlab, lệnh là ['rng ('shuffle')'] (http://mathworks.com/help/matlab/ref/rng.html), đặt hạt giống dựa trên thời gian hiện tại. –

Trả lời

24

Cách cũ để làm việc đó:

randn('seed',0) 

Cách mới:

s = RandStream('mcg16807','Seed',0) 
RandStream.setDefaultStream(s) 

Lưu ý rằng nếu bạn sử dụng các phương pháp mới, randrandn cổ phiếu cùng một luồng vì vậy nếu bạn đang gọi cả hai, bạn có thể tìm thấy các số khác nhau được tạo ra so với phương pháp cũ (trong đó có máy phát riêng biệt). Phương thức cũ vẫn được hỗ trợ vì lý do này (và mã cũ).

Xem http://www.mathworks.com/help/techdoc/math/bsn94u0-1.html để biết thêm thông tin.

+0

hoạt động như một sự quyến rũ, cảm ơn! – Gacek

+1

Lưu ý rằng liên kết hiện hiển thị phiên bản 2011a sử dụng chức năng 'rng'. – Debilski

+8

Ngoài ra, có vẻ như bây giờ họ khuyên bạn nên sử dụng 'RandStream.setGlobalStream' thay vì' RandStream.setDefaultStream'. Rõ ràng nó sẽ thay thế chức năng đó trong các phiên bản sau. – Brandon

9

Bạn chỉ có thể gọi rng(mySeed) để đặt hạt giống cho luồng toàn cầu (được thử nghiệm trong Matlab R2011b). Điều này ảnh hưởng đến các chức năng rand, randnrandi.

same page that James linked to liệt kê đây là phương án thay thế được đề xuất cho các phương pháp cũ khác nhau (xem ô giữa của cột bên phải của bảng).

Dưới đây là một số mã ví dụ:

 
format long;    % Display numbers with full precision 
format compact;   % Get rid of blank lines between output 
mySeed = 10; 
rng(mySeed);    % Set the seed 
disp(rand([1,3])); 
disp(randi(10,[1,10])); 
disp(randn([1,3])); 
disp(' '); 
rng(mySeed);    % Set the seed again to duplicate the results 
disp(rand([1,3])); 
disp(randi(10,[1,10])); 
disp(randn([1,3])); 

đầu ra của nó là:

 
    0.771320643266746 0.020751949359402 0.633648234926275 
    8  5  3  2  8  2  1  7 10  1 
    0.060379730526407 0.622213879877005 0.109700311365407 

    0.771320643266746 0.020751949359402 0.633648234926275 
    8  5  3  2  8  2  1  7 10  1 
    0.060379730526407 0.622213879877005 0.109700311365407 
2
mySeed=57; % an integer number 
rng(mySeed,'twister') %You can replace 'twister' with other generators 
+0

Thx. Bỏ phiếu này lên! –

0

Khi bạn chỉ muốn thiết lập lại RNG một số trạng thái đã biết, chỉ cần sử dụng:

seed = 0; 
randn('state', seed); 
rand ('state', seed); 
A = round(10*(rand(1,5))); // always will be [10 2 6 5 9] 
Các vấn đề liên quan