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?

23
demandé sur steadyfish 2011-01-13 18:55:38

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.

24
répondu James 2013-05-22 14:28:03

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
9
répondu Brandon 2012-06-22 00:07:07
mySeed=57; % an integer number
rng(mySeed,'twister') %You can replace 'twister' with other generators
2
répondu C graphics 2013-02-04 19:48:04

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]
0
répondu teejay 2014-05-10 10:21:11