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]