Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

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

Consulte también

|

Temas relacionados