web-dev-qa-db-fra.com

Comment définir une graine personnalisée pour le générateur de nombres pseudo-aléatoires

Je dois effectuer quelques tests où j'utilise le générateur de nombres pseudo aléatoires randn. Comment puis-je définir la graine moi-même, donc chaque fois que je lance ce test, j'obtiens 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 possède la propriété seed, mais il est en lecture seule. Est-il possible de l'utiliser pour ensemencer le générateur? 

23
Gacek

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 méthode, Rand et randn partagent le même flux. Par conséquent, si vous appelez les deux, vous pouvez trouver différents numéros générés par rapport à l'ancienne méthode (qui a des générateurs distincts). L'ancienne méthode est toujours prise en charge pour cette raison (et le code hérité).

Voir http://www.mathworks.com/help/techdoc/math/bsn94u0-1.html pour plus d'informations.

24
James

Vous pouvez simplement appeler rng(mySeed) pour définir le germe du flux global (testé dans Matlab R2011b). Ceci affecte les fonctions Rand, randn et randi.

La page same que James a liée à répertorie cette option comme alternative recommandée à diverses méthodes anciennes (voir la cellule du milieu de la colonne de droite du tableau).

Voici un exemple de code:

 format long; % Afficher les nombres avec une précision absolue 
 Format compact; % Supprime les lignes vides entre les sorties 
 MySeed = 10; 
 Rng (mySeed); % Définir la graine 
 Disp (Rand ([1,3])); 
 Disp (Randi (10, [1,10])); 
 Disp (randn ([1,3])) ; 
 disp (''); 
 rng (mySeed); % Réglez à nouveau la graine pour dupliquer les résultats 
 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
Brandon
mySeed=57; % an integer number
rng(mySeed,'twister') %You can replace 'twister' with other generators
2
C graphics

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
teejay