webentwicklung-frage-antwort-db.com.de

Also legen Sie einen angesehenen Startwert für den Pseudo-Zufallszahlengenerator fest

Ich muss einige Tests durchführen, bei denen ich randn Pseudo-Zufallszahlengenerator verwende. Wie kann ich den Grundwert selbst festlegen, so dass ich jedes Mal, wenn ich diesen Test durchführe, die gleichen Ergebnisse bekomme? (Ja, ich weiß, es ist ein bisschen komisch, aber das ist das Problem).

Ich habe das RANDSTREAM-Objekt gefunden, das über die seed-Eigenschaft verfügt, jedoch schreibgeschützt ist. Gibt es eine Möglichkeit, den Generator zu impfen? 

23
Gacek

Der alte Weg es zu tun:

randn('seed',0)

Der neue Weg:

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

Wenn Sie die neue Methode verwenden, verwenden Rand und randn den gleichen Stream. Wenn Sie also beide aufrufen, werden möglicherweise andere Nummern generiert als bei der alten Methode (die über separate Generatoren verfügt). Die alte Methode wird aus diesem Grund (und älterer Code) weiterhin unterstützt.

Siehe http://www.mathworks.com/help/techdoc/math/bsn94u0-1.html für weitere Informationen.

24
James

Sie können einfach rng(mySeed) aufrufen, um den Startwert für den globalen Stream festzulegen (getestet in Matlab R2011b). Dies betrifft die Funktionen Rand, randn und randi.

Die gleiche Seite, mit der James verlinkt hat listet diese als empfohlene Alternative zu verschiedenen alten Methoden auf (siehe mittlere Zelle der rechten Spalte der Tabelle).

Hier ist ein Beispielcode:

 Format lang; % Zahlen mit voller Genauigkeit anzeigen 
 Format kompakt; % Entfernen Sie leere Zeilen zwischen der Ausgabe 
 MySeed = 10; 
 Rng (mySeed); % Setzen Sie den Samen 
 Disp (Rand ([1,3])); 
 Disp (randi (10, [1,10])); 
 Disp (randn ([1,3])) ; 
 disp (''); 
 rng (mySeed); % Setzen Sie den Samen erneut, um die Ergebnisse zu duplizieren 
 Disp (Rand ([1,3])); 
 Disp (randi (10, [1,10])); 
 Disp (randn ([1 ,3]));

Ihre Ausgabe ist:

 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 
9
Brandon
mySeed=57; % an integer number
rng(mySeed,'twister') %You can replace 'twister' with other generators
2
C graphics

Wenn Sie den RNG nur in einen bekannten Zustand zurücksetzen möchten, verwenden Sie einfach:

 seed = 0;
 randn('state', seed);
 Rand ('state', seed);
 A = round(10*(Rand(1,5))); // always will be [10 2 6 5 9]
0
teejay