Main Content

Secuencias múltiples

Utilizar varias secuencias independientes

El software de MATLAB® incluye algoritmos de generación que le permiten crear secuencias múltiples de números aleatorios independientes. Por ejemplo, los cuatro tipos de generador que admiten varias secuencias independientes son los generadores combinado múltiple recursivo ('mrg32k3a'), de Fibonacci retardado multiplicativo ('mlfg6331_64'), Philox 4x32 "philox4x32_10") y Threefry 4x64 ("threefry4x64_20"). Puede generar múltiples secuencias independientes que se garantiza que no se superpongan y para las que se han realizado pruebas que demuestran la (seudo)independencia de los valores entre secuencias. Para obtener información sobre los algoritmos del generador que admiten varias secuencias, consulte la tabla de algoritmos del generador en Crear y controlar una secuencia de números aleatorios.

La función RandStream.create le permite crear secuencias que tengan el mismo algoritmo de generación y valor de semilla pero que sean estadísticamente independientes.

[s1,s2,s3] = RandStream.create('mlfg6331_64','NumStreams',3)
s1 = 
mlfg6331_64 random stream
      StreamIndex: 1
       NumStreams: 3
             Seed: 0
  NormalTransform: Ziggurat

s2 = 
mlfg6331_64 random stream
      StreamIndex: 2
       NumStreams: 3
             Seed: 0
  NormalTransform: Ziggurat

s3 = 
mlfg6331_64 random stream
      StreamIndex: 3
       NumStreams: 3
             Seed: 0
  NormalTransform: Ziggurat

Como prueba de la independencia, puede ver que estas secuencias apenas están correlacionadas.

r1 = rand(s1,100000,1);
r2 = rand(s2,100000,1); 
r3 = rand(s3,100000,1);
corrcoef([r1,r2,r3])
ans = 3×3

    1.0000    0.0007    0.0052
    0.0007    1.0000    0.0000
    0.0052    0.0000    1.0000

Según la aplicación, crear solo algunas de las secuencias en un conjunto de secuencias independientes puede ser útil si necesita simular ciertos eventos. Especifique el parámetro StreamIndices para crear solo algunas de las secuencias de un conjunto de varias secuencias. La propiedad StreamIndex devuelve el índice de cada secuencia que crea.

streamNum = 256;
streamId = 4;
s4 = RandStream.create('mlfg6331_64','NumStreams',streamNum,'StreamIndices',streamId)
s4 = 
mlfg6331_64 random stream
      StreamIndex: 4
       NumStreams: 256
             Seed: 0
  NormalTransform: Ziggurat

Las secuencias múltiples, dado que son estadísticamente independientes, se pueden utilizar para comprobar la precisión de una simulación. Por ejemplo, un conjunto de secuencias independientes se puede usar para repetir una simulación Montecarlo varias veces en distintas sesiones de MATLAB o en diferentes procesadores y determinar la variación en los resultados. Esto hace que las secuencias múltiples sean útiles en simulaciones paralelas a gran escala.

Utilizar semillas para obtener diferentes resultados

Para tipos de generadores que no admitan de forma explícita secuencias independientes, las diferentes semillas proporcionan un método con el que crear secuencias múltiples. Utilizando semillas diferentes, puede crear secuencias que devuelvan valores diferentes y actúen de manera diferente entre sí. Sin embargo, utilizar un generador específicamente diseñado para secuencias múltiples independientes es una mejor opción, ya que las propiedades estadísticas entre las secuencias se han verificado cuidadosamente.

Cree dos secuencias con dos semillas diferentes con el generador Mersenne Twister.

s1 = RandStream('mt19937ar','Seed',1)
s1 = 
mt19937ar random stream
             Seed: 1
  NormalTransform: Ziggurat

s2 = RandStream('mt19937ar','Seed',2)
s2 = 
mt19937ar random stream
             Seed: 2
  NormalTransform: Ziggurat

Utilice la primera secuencia en una sesión de MATLAB para generar números aleatorios.

r1 = rand(s1,100000,1);

Utilice la segunda secuencia en otra sesión de MATLAB para generar números aleatorios.

r2 = rand(s2,100000,1);

Con diferentes semillas, las secuencias suelen devolver valores que no están correlacionados.

corrcoef([r1,r2])
ans = 2×2

    1.0000    0.0030
    0.0030    1.0000

Puede que las dos secuencias con dos semillas diferentes no parezcan relacionadas ya que el espacio de estado del Mersenne Twister es mucho más grande (219937 elementos) que el número de semillas posibles (232). Las posibilidades de superposición en ejecuciones de simulaciones diferentes son bastante remotas a menos que utilice un gran número de semillas diferentes. El uso de semillas muy espaciadas no aumenta el nivel de aleatoriedad. De hecho, llevar esta estrategia al extremo y volver a alimentar un generador antes de cada llamada puede resultar en la secuencia de valores que no están distribuidos de manera idéntica y no son estadísticamente independientes.

Alimentar una secuencia es más útil si la utiliza como un paso de iniciación, quizás al inicio de MATLAB o antes de ejecutar una simulación.

Utilizar subsecuencias para obtener resultados diferentes

Otro método para conseguir resultados diferentes de una secuencia es utilizar subsecuencias. A diferencia de las semillas, donde las ubicaciones en la secuencia de números aleatorios no se conocen exactamente, el espacio entre las subsecuencias es conocido, por lo que cualquier posibilidad de superposición se puede eliminar. Al igual que las secuencias paralelas independientes, se ha realizado la investigación para demostrar independencia estadística en las subsecuencias. En resumen, las subsecuencias son una forma más controlada de hacer muchas de las mismas cosas para las que tradicionalmente se han usado las semillas y una solución más ligera que las secuencias paralelas.

Las subsecuencias proporcionan una manera más rápida y sencilla de garantizar que obtiene resultados diferentes para el mismo código en momentos diferentes. Por ejemplo, genere varios números aleatorios en un bucle.

defaultStream = RandStream('mlfg6331_64');
RandStream.setGlobalStream(defaultStream)
for i = 1:5
    defaultStream.Substream = i;
    z = rand(1,i)
end
z = 0.6986
z = 1×2

    0.9230    0.2489

z = 1×3

    0.0261    0.2530    0.0737

z = 1×4

    0.3220    0.7405    0.1983    0.1052

z = 1×5

    0.2067    0.2417    0.9777    0.5970    0.4187

En otro bucle, puede generar valores aleatorios que sean independientes del primer conjunto de 5 iteraciones.

for i = 6:10
    defaultStream.Substream = i;
    z = rand(1,11-i)
end
z = 1×5

    0.2650    0.8229    0.2479    0.0247    0.4581

z = 1×4

    0.3963    0.7445    0.7734    0.9113

z = 1×3

    0.2758    0.3662    0.7979

z = 1×2

    0.6814    0.5150

z = 0.5247

Cada una de estas subsecuencias puede reproducir su iteración de bucle. Por ejemplo, puede regresar a la 6.ª subsecuencia en el bucle.

defaultStream.Substream = 6;
z = rand(1,5)
z = 1×5

    0.2650    0.8229    0.2479    0.0247    0.4581

Consulte también

|

Temas relacionados