Comment définir une graine personnalisée pour le générateur de nombres pseudo-aléatoires
J'ai besoin d'effectuer quelques tests où j'utilise randn pseudo générateur de nombre aléatoire. Comment puis-je définir la graine par moi-même, donc chaque fois que je lance ce test, j'obtiendrai les mêmes résultats? (Oui, je sais que c'est un peu bizarre, mais c'est le problème).
J'ai trouvé l'objet RANDSTREAM qui a la propriété seed, mais il est en lecture seule. Est-il possible de l'utiliser pour semer le générateur?
4 réponses
L'ancienne façon de le faire:
randn('seed',0)
La nouvelle façon:
s = RandStream('mcg16807','Seed',0)
RandStream.setDefaultStream(s)
Notez que si vous utilisez la nouvelle façon, rand et randn partagent le même flux, donc si vous appelez les deux, vous pouvez trouver des numéros différents générés par rapport à l'ancienne méthode (qui a des générateurs séparés). L'ancienne méthode est toujours supportée pour cette raison (et le code hérité).
Voir http://www.mathworks.com/help/techdoc/math/bsn94u0-1.html pour plus d'informations.
Vous pouvez simplement appeler rng(mySeed) pour définir la graine pour le flux global (testé dans Matlab R2011b). Cela affecte le rand, randn, et randi fonctions.
La même page que James A liée à répertorie ceci comme l'alternative recommandée aux diverses anciennes méthodes (voir la cellule du milieu de la colonne de droite du tableau).
Voici un exemple de code:
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]));
Sa sortie est:
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
mySeed=57; % an integer number
rng(mySeed,'twister') %You can replace 'twister' with other generators
Lorsque vous voulez simplement réinitialiser le RNG à un état connu, utilisez simplement:
seed = 0;
randn('state', seed);
rand ('state', seed);
A = round(10*(rand(1,5))); // always will be [10 2 6 5 9]