2011-01-13 10 views
23

randn擬似乱数ジェネレータを使用するテストをほとんど実行する必要はありません。どのように私は自分自身で種を設定できますか?このテストを実行するたびに同じ結果が得られますか? (ええ、私はそれが少し変だと思いますが、それが問題です)。擬似乱数ジェネレータのカスタムシードを設定する方法

seedプロパティを持つRANDSTREAMオブジェクトが見つかりましたが、読み取り専用です。発電機を播種するためにそれを使用する方法はありますか?

+6

いいえ、それは変わっていません。実際には、テストとデバッグにとってはかなり重要です。 – Jonas

+0

@Jonas、yup、とりわけ結果の再現性に関して... – Gacek

+0

逆のこと、すなわちMatlabを再起動するたびに再現性を避けるために、コマンドは['rng( 'shuffle')']( http://mathworks.com/help/matlab/ref/rng.html)、現在の時刻に基づいてシードを設定します。 –

答えて

24

それを行うための古い方法:

randn('seed',0) 

新しい方法:あなたは、randrandn共有し、同じストリームの新しい方法を使用する場合

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

注呼び出しているので、もしこと両方とも、古いメソッド(別々のジェネレータを持つ)とは違った数の数字が生成されることがあります。古い方法は、この理由(およびレガシーコード)でも引き続きサポートされています。

詳細はhttp://www.mathworks.com/help/techdoc/math/bsn94u0-1.htmlを参照してください。

+0

は、魅力のように動作します、ありがとう! – Gacek

+1

リンクには、 'rng'機能を使用する2011aバージョンが表示されることに注意してください。 – Debilski

+8

また、 'RandStream.setDefaultStream'の代わりに' RandStream.setGlobalStream'を使うことを推奨しているようです。明らかに、将来のバージョンではその機能を置き換えます。 – Brandon

9

rng(mySeed)を呼び出して、グローバルストリーム(Matlab R2011bでテスト済み)のシードを設定できます。これは、rand,randn、およびrandiの機能に影響します。

same page that James linked toは、これをさまざまな古い方法の推奨代替品としてリストしています(表の右欄の中央のセルを参照)。

ここではいくつかのサンプルコードです:

 
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])); 

その出力は次のようになります。

 
    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。これに投票してください! –

0

あなただけだけ使用し、いくつかの既知の状態にRNGをリセットしたいときは:

seed = 0; 
randn('state', seed); 
rand ('state', seed); 
A = round(10*(rand(1,5))); // always will be [10 2 6 5 9] 
は、
関連する問題