Gestionar la secuencia global con RandStream
Las funciones rand
, randn
, randi
y randperm
extraen números aleatorios de una secuencia de números aleatorios subyacente, llamada la secuencia global. La secuencia global es un objeto RandStream
. La función rng
proporciona una forma sencilla de controlar la secuencia global. Para un control más exhaustivo, la clase RandStream
le permite crear una secuencia independiente de la secuencia global, obtener un identificador para la secuencia global y controlar la generación de números aleatorios.
Utilice rng
para establecer el generador de números aleatorios en la semilla (0
) y algoritmo (Mersenne Twister) predeterminados. Guarde la configuración del generador.
rng('default')
s = rng
s = struct with fields:
Type: 'twister'
Seed: 0
State: [625x1 uint32]
Cree un vector fila de 1 por 6 de valores aleatorios distribuidos de manera uniforme entre 0 y 1.
x = rand(1,6)
x = 1×6
0.8147 0.9058 0.1270 0.9134 0.6324 0.0975
Utilice RandStream.getGlobalStream
para devolver un identificador a la secuencia global, es decir, la secuencia global actual de la que rand
genera números aleatorios. Si utiliza RandStream.getGlobalStream
para obtener un identificador para la secuencia global, puede ver los cambios que realizó a la secuencia global con rng
.
globalStream = RandStream.getGlobalStream
globalStream = mt19937ar random stream (current global stream) Seed: 0 NormalTransform: Ziggurat
Cambie la semilla y el algoritmo del generador y cree un nuevo vector fila aleatorio. Muestre la secuencia global actual de la que rand
genera números aleatorios.
rng(1,'philox')
xnew = rand(1,6)
xnew = 1×6
0.5361 0.2319 0.7753 0.2390 0.0036 0.5262
globalStream = RandStream.getGlobalStream
globalStream = philox4x32_10 random stream (current global stream) Seed: 1 NormalTransform: Inversion
A continuación, restaure la configuración original del generador y cree un vector aleatorio. El resultado concuerda con el vector fila original que x
creó con el generador predeterminado.
rng(s) xold = rand(1,6)
xold = 1×6
0.8147 0.9058 0.1270 0.9134 0.6324 0.0975
De manera predeterminada, las funciones de generación de números aleatorios, como rand
, utilizan la secuencia de números aleatorios global. Para especificar una secuencia diferente, cree otro objeto de RandStream
. Páselo como el primer argumento de entrada a rand
. Por ejemplo, cree un vector 1 por 6 de números aleatorios usando Mersenne twister rápido orientado a SIMD.
myStream = RandStream('dsfmt19937')
myStream = dsfmt19937 random stream Seed: 0 NormalTransform: Ziggurat
r = rand(myStream,1,6)
r = 1×6
0.0306 0.2131 0.2990 0.3811 0.8635 0.1334
Cuando llama a la función rand
con myStream
como el primer argumento de entrada, extrae números de myStream
y no afecta a los resultados de la secuencia global.
Si desea establecer myStream
como una secuencia global, puede utilizar la función del objeto RandStream.setGlobalStream
.
RandStream.setGlobalStream(myStream) globalStream = RandStream.getGlobalStream
globalStream = dsfmt19937 random stream (current global stream) Seed: 0 NormalTransform: Ziggurat
En muchos casos, la función rng
es todo lo que necesita para controlar la secuencia global, pero la clase RandStream
permite el control sobre ciertas funcionalidades avanzadas, como la elección del algoritmo utilizado para los valores aleatorios normales.
Por ejemplo, cree un objeto RandStream
y especifique el algoritmo de transformación para generar valores seudoaleatorios distribuidos normalmente cuando utiliza randn
. Genere valores seudoaleatorios distribuidos normalmente con el algoritmo de transformación Polar
, en vez del algoritmo de transformación Ziggurat
predeterminado.
myStream = RandStream('mt19937ar','NormalTransform','Polar')
myStream = mt19937ar random stream Seed: 0 NormalTransform: Polar
Establezca myStream
como la secuencia global. Cree 6 números aleatorios con distribución normal a partir de la secuencia global.
RandStream.setGlobalStream(myStream) randn(1,6)
ans = 1×6
0.2543 -0.7733 -1.7416 0.3686 0.5965 -0.0191