2011-01-13 10 views
23

Necesito realizar algunas pruebas donde utilizo el generador de números pseudoaleatorios randn. ¿Cómo puedo establecer la semilla por mi cuenta, por lo que cada vez que ejecuto esta prueba obtendré los mismos resultados? (Sí, sé que es un poco raro, pero ese es el problema).Cómo establecer la inicialización personalizada para el generador de números pseudoaleatorios

He encontrado el objeto RANDSTREAM que tiene la propiedad seed, pero es de solo lectura. ¿Hay alguna forma de usarlo para sembrar el generador?

+6

No, eso no es raro. De hecho, es bastante importante para probar y depurar. – Jonas

+0

@Jonas, sí, especialmente cuando se trata de la repetibilidad de los resultados ... – Gacek

+0

Tenga en cuenta que para hacer lo contrario, es decir, para evitar la repetibilidad cada vez que reiniciamos Matlab, el comando es ['rng ('shuffle')'] (http://mathworks.com/help/matlab/ref/rng.html), que establece la semilla en función de la hora actual. –

Respuesta

24

La antigua forma de hacerlo:

randn('seed',0) 

La nueva forma:

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

Tenga en cuenta que si se utiliza la nueva forma, rand y randn comparten la misma corriente por lo que si usted está llamando ambos, es posible que se generen números diferentes en comparación con el método anterior (que tiene generadores separados). El antiguo método aún es compatible por esta razón (y el código heredado).

Consulte http://www.mathworks.com/help/techdoc/math/bsn94u0-1.html para obtener más información.

+0

funciona como un encanto, gracias! – Gacek

+1

Tenga en cuenta que el enlace ahora muestra la versión 2011a que utiliza la función 'rng'. – Debilski

+8

Además, parece que ahora recomiendan usar 'RandStream.setGlobalStream' en lugar de' RandStream.setDefaultStream'. Aparentemente reemplazará esa función en futuras versiones. – Brandon

9

Puede simplemente llamar al rng(mySeed) para establecer la semilla para el flujo global (probado en Matlab R2011b). Esto afecta las funciones rand, randn y randi.

El same page that James linked to lo enumera como la alternativa recomendada a varios métodos antiguos (consulte la celda central de la columna derecha de la tabla).

Aquí hay un código de ejemplo:

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

Su salida es:

 
    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 esto! –

0

Cuando sólo desea restablecer el generador de números aleatorios a algún estado conocido, sólo tiene que utilizar:

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