Main Content

Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Gestionar la secuencia global

rand, randn y randi extraen números aleatorios de una secuencia de números aleatorios subyacente, llamada la secuencia global. La función rng proporciona una forma sencilla de controlar la secuencia global. Para un control más exhaustivo, la clase RandStream le permite obtener un identificador para la secuencia global y controlar la generación de números aleatorios.

Obtenga un identificador para la secuencia global de esta manera:

globalStream = RandStream.getGlobalStream
globalStream = 

mt19937ar random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

Devuelva las propiedades de la secuencia con el método get:

get(globalStream)
             Type: 'mt19937ar'
       NumStreams: 1
      StreamIndex: 1
        Substream: 1
             Seed: 0
            State: [625x1 uint32]
  NormalTransform: 'Ziggurat'
       Antithetic: 0
    FullPrecision: 1

Ahora, utilice la función rand para generar valores aleatorios uniformes a partir de la secuencia global.

rand(1,5);

Utilice las funciones randn y randi para generar valores aleatorios normales y enteros a partir de la secuencia global.

A = randi(100,1,5);
A = randn(1,5);

La propiedad State representa el estado interno del generador. Puede guardar la propiedad State de globalStream.

myState = globalStream.State;

Con myState, puede restaurar el estado de globalStream y reproducir resultados anteriores.

myState = globalStream.State;
A = rand(1,100);
globalStream.State = myState;
B=rand(1,100);
isequal(A,B)

ans =

     1

rand, randi y randn acceden a la secuencia global. Dado que todas estas funciones acceden a la misma secuencia subyacente, llamar a una de ellas afecta a los valores que producirá el resto de ellas en las siguientes llamadas.

globalStream.State = myState;
A = rand(1,100);
globalStream.State = myState;
randi(100);
B = rand(1,100);
isequal(A,B)

ans =

     0

La secuencia global es un objeto identificador de la clase RandStream. RandStream.getGlobalStream devuelve un identificador. Las propiedades de la secuencia global se pueden ver o modificar desde cualquier identificador de la secuencia.

stream1=RandStream.getGlobalStream;
stream2=RandStream.getGlobalStream;
stream1.NormalTransform='Polar';
stream2.NormalTransform
ans =

Polar

La siguiente tabla muestra los métodos disponibles para la clase RandStream. Los métodos estáticos se indican con la sintaxis RandStream.methodName.

MétodoDescripción
RandStreamCrea una secuencia de números aleatorios
RandStream.createCrea secuencias múltiples de números aleatorios independientes
getObtiene las propiedades de una secuencia aleatoria
RandStream.listEnumera los algoritmos de generación de números aleatorios disponibles
RandStream.getGlobalStreamObtiene la secuencia de números aleatorios
RandStream.setGlobalStreamEstablece la secuencia global de números aleatorios
setEstablece una propiedad de una secuencia aleatoria
resetRestablece una secuencia a su estado interno inicial
randGenera números seudoaleatorios a partir de una distribución uniforme
randnGenera números seudoaleatorios a partir de una distribución normal estándar
randiGenera números enteros seudoaleatorios a partir de una distribución discreta uniforme
randpermPermutación aleatoria de un conjunto de valores

En la siguiente tabla se indican las propiedades de una secuencia aleatoria.

PropiedadDescripción
Type(Solo lectura) El algoritmo de generación que utiliza la secuencia. RandStream.list especifica los posibles generadores.
Seed(Solo lectura) El valor de la semilla utilizada para crear la secuencia.
NumStreams(Solo lectura) El número de secuencias del grupo en el que se creó la actual secuencia.
StreamIndex(Solo lectura) El índice de la actual secuencia a partir del grupo de secuencias con las que se creó la actual secuencia.
StateEl estado interno del generador. No depende del formato de esta propiedad. El valor que le asigne a S.State ha de ser un valor leído previamente de S.State.
SubstreamEl índice de la subsecuencia en la que está definida la secuencia en este momento. El valor predeterminado es 1. No todos los tipos de generadores admiten subsecuencias múltiples; el generador de Fibonacci retardado multiplicativo (mlfg6331_64) y el generador combinado múltiple recursivo (mrg32k3a) admiten subsecuencias.
NormalTransformEl algoritmo de transformación utilizado por randn(s, ...) para generar valores normales seudoaleatorios. Los valores posibles son 'Ziggurat', 'Polar' o 'Inversion'.
AntitheticEl valor lógico que indica si S genera valores seudoaleatorios antieticos. Para los valores uniformes, estos son los valores habituales restados de 1. El valor predeterminado es falso.
FullPrecisionEl valor lógico que indica si s genera valores con su precisión completa. Si FullPrecision es falso, algunos generadores pueden crear valores seudoaleatorios más rápido, pero con menos bits aleatorios. El valor predeterminado es verdadero.

Supongamos que desea repetir una simulación. La clase RandStream le ofrece varias formas de replicar la salida. Como se muestra en el ejemplo anterior, puede guardar el estado de la secuencia global.

myState=GlobalStream.State;
A=rand(1,100);
GlobalStream.State=myState;
B=rand(1,100);
isequal(A,B)

ans =

     1

También puede restablecer una secuencia a su configuración inicial con el método reset.

reset(GlobalStream)
A=rand(1,100);
reset(GlobalStream)
B=rand(1,100);
isequal(A,B)

ans =

     1

Tipos de datos de números aleatorios

De forma predeterminada, rand y randn generan valores de precisión doble.

GlobalStream=RandStream.getGlobalStream;
myState=GlobalStream.State;
A=rand(1,5);
class(A)

ans =

double

Para especificar la clase como doble de forma explícita:

GlobalStream.State=myState;
B=rand(1,5,'double');
class(B)

ans =

double
isequal(A,B)

ans =

     1

rand y randn también generarán valores de precisión simple.

GlobalStream.State=myState;
A=rand(1,5,'single');
class(A)
ans =

single

Los valores son los mismos que si hubiera proyectado los valores de precisión doble del ejemplo anterior. La secuencia aleatoria de la que extraen las funciones avanza de la misma manera con independencia de la clase de valores que se devuelvan.

A,B

A =

    0.8235    0.6948    0.3171    0.9502    0.0344


B =

    0.8235    0.6948    0.3171    0.9502    0.0344

randi admite tanto tipos enteros como precisión doble y simple.

A=randi([1 10],1,5,'double');
class(A)

ans =

double
B=randi([1 10],1,5,'uint8');
class(B)

ans =

uint8

Consulte también

Temas relacionados