2011-01-13 16 views
23

Ho bisogno di eseguire alcuni test in cui utilizzo il generatore di numeri pseudo casuali randn. Come posso impostare il seme da solo, quindi ogni volta che eseguo questo test otterrò gli stessi risultati? (Sì, lo so che è un po 'strano, ma questo è il problema).Come impostare il seme personalizzato per il generatore di numeri pseudo casuali

Ho trovato l'oggetto RANDSTREAM che ha la proprietà seed, ma è di sola lettura. C'è un modo per usarlo per seminare il generatore?

+6

No, non è strano. In realtà è abbastanza importante per il test e il debug. – Jonas

+0

@Jonas, sì, specialmente quando si tratta di ripetibilità dei risultati ... – Gacek

+0

Nota che per fare il contrario, cioè per evitare ripetibilità ogni volta che riavviamo Matlab, il comando è ['rng ('shuffle')'] (http://mathworks.com/help/matlab/ref/rng.html), che imposta il seme in base all'ora corrente. –

risposta

24

Il vecchio modo di farlo:

randn('seed',0) 

Il nuovo modo:

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

Si noti che se si utilizza il nuovo modo, rand e randn condividono lo stesso flusso, quindi se si sta chiamando entrambi, puoi trovare numeri diversi generati rispetto al vecchio metodo (che ha generatori separati). Il vecchio metodo è ancora supportato per questo motivo (e codice legacy).

Vedere http://www.mathworks.com/help/techdoc/math/bsn94u0-1.html per ulteriori informazioni.

+0

funziona come un incantesimo, grazie! – Gacek

+1

Nota che il link ora mostra la versione 2011a che usa la funzione 'rng'. – Debilski

+8

Inoltre, sembra che ora raccomandino l'uso di 'RandStream.setGlobalStream' invece di' RandStream.setDefaultStream'. Apparentemente sostituirà quella funzione nelle versioni future. – Brandon

9

È possibile chiamare semplicemente rng(mySeed) per impostare il seme per lo stream globale (testato in Matlab R2011b). Questo riguarda le funzioni rand, randn e randi.

Lo same page that James linked to lo elenca come alternativa consigliata a vari metodi precedenti (vedere la cella centrale della colonna destra della tabella).

Ecco qualche esempio di codice:

 
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])); 

La sua uscita è:

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

Thx. Vota questo! –

0

Quando si desidera solo per ripristinare il RNG per uno stato noto, basta usare:

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