Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Controlando la generación de números aleatorios

En este ejemplo se muestra cómo utilizar la función, que proporciona control sobre la generación aleatoria de números.rng

Pseudo Los números aleatorios en MATLAB provienen de las funciones.randrandirandn Muchas otras funciones llaman a esos tres, pero esos son los bloques de construcción fundamentales. Los tres dependen de un único generador de números aleatorios compartido que puede controlar utilizando.rng

Es importante darse cuenta de que los números "aleatorios" en MATLAB no son impredecibles en absoluto, sino que son generados por un algoritmo determinista. El algoritmo está diseñado para ser lo suficientemente complicado para que su salida sea una secuencia aleatoria independiente para alguien que no conoce el algoritmo, y puede pasar varias pruebas estadísticas de aleatoriedad.appears La función que se introduce aquí proporciona formas de aprovechar el determinismo para

  • repetir los cálculos que implican números aleatorios, y obtener los mismos resultados, o

  • garantizar que se utilicen diferentes números aleatorios en los cálculos repetidos

y aprovechar la aparente aleatoriedad para justificar la combinación de resultados de cálculos separados.

"Comenzando"

Si observa la salida de, o en una nueva sesión de MATLAB, observará que devuelven las mismas secuencias de números cada vez que reinicia MATLAB.randrandirandn A menudo es útil poder restablecer el generador de números aleatorios a ese estado de inicio, sin reiniciar MATLAB. Por ejemplo, es posible que desee repetir un cálculo que implique números aleatorios y obtener el mismo resultado.

proporciona una manera muy simple de poner el generador de números aleatorios de nuevo a su configuración predeterminada.rng

rng default rand % returns the same value as at startup
ans = 0.8147 

¿Cuáles son los ajustes de números aleatorios "predeterminados" con los que MATLAB se inicia o que le proporcionan?rng default Si llama sin entradas, puede ver que es el algoritmo generador de Mersenne Twister, sembrado con 0.rng

rng
ans = struct with fields:
     Type: 'twister'
     Seed: 0
    State: [625x1 uint32]

Verá con más detalle a continuación cómo utilizar la salida anterior, incluido el campo, para controlar y cambiar la forma en que MATLAB genera números aleatorios.State Por ahora, sirve como una manera de ver qué generador, y está utilizando actualmente.randrandirandn

No repetibilidad

Cada vez que llama, o, dibujan un nuevo valor de su generador de números aleatorios compartidos, y los valores sucesivos se pueden tratar como estadísticamente independientes.randrandirandn Pero como se mencionó anteriormente, cada vez que reinicie MATLAB esas funciones se restablecen y devuelven las mismas secuencias de números. Obviamente, los cálculos que usan los números "aleatorios" no se pueden pensar como estadísticamente independientes.same Por lo tanto, cuando es necesario combinar los cálculos realizados en dos o más sesiones de MATLAB como si fueran estadísticamente independientes, no se puede utilizar la configuración predeterminada del generador.were

Una forma sencilla de evitar repetir los mismos números aleatorios en una nueva sesión de MATLAB es elegir una semilla diferente para el generador de número aleatorio. le da una manera fácil de hacerlo, mediante la creación de una semilla basada en la hora actual.rng

rng shuffle rand
ans = 0.6074 

Cada vez que se utiliza, se vuelve a sellar el generador con una semilla diferente.'shuffle' Puede llamar sin entradas para ver qué semilla usó realmente.rng

rng
ans = struct with fields:
     Type: 'twister'
     Seed: 65482376
    State: [625x1 uint32]

rng shuffle % creates a different seed each time rng
ans = struct with fields:
     Type: 'twister'
     Seed: 65482385
    State: [625x1 uint32]

rand
ans = 0.5531 

es una manera muy fácil de reprecintado el generador de números aleatorios.'shuffle' Se podría pensar que es una buena idea, o incluso necesario, usarla para obtener una aleatoriedad "verdadera" en MATLAB. Sin embargo, para la mayoría de los propósitos,it is not necessary to use 'shuffle'. at all La elección de una semilla basada en el tiempo actual no mejora las propiedades estadísticas de los valores que obtendrá de, y, y no los hace "más aleatorios" en cualquier sentido real.randrandirandn Si bien está perfectamente bien resellar el generador cada vez que inicie MATLAB, o antes de ejecutar algún tipo de cálculo grande que implique números aleatorios, en realidad no es una buena idea resellar el generador con demasiada frecuencia dentro de una sesión, ya que esto puede afectar al propiedades estadísticas de sus números aleatorios.

Lo que sí proporciona es una manera de evitar repetir las mismas secuencias de valores.'shuffle' A veces eso es crítico, a veces es simplemente "agradable", pero a menudo no es importante en absoluto. Tenga en cuenta que si utiliza, es posible que desee guardar la semilla que se creó para que pueda repetir sus cálculos más adelante.'shuffle'rng Verás cómo hacerlo a continuación.

Más control sobre la repetibilidad y la no repetibilidad

Hasta ahora, ha visto cómo restablecer el generador de números aleatorios a su configuración predeterminada y reinicializar utilizando una semilla que se crea utilizando la hora actual. también proporciona una manera de reprecintado usando una semilla específica.rng

Puede utilizar la misma semilla varias veces, para repetir los mismos cálculos. Por ejemplo, si ejecuta este código dos veces...

rng(1) % the seed is any non-negative integer < 2^32 x = randn(1,5)
x = 1×5

   -0.6490    1.1812   -0.7585   -1.1096   -0.8456

rng(1) x = randn(1,5)
x = 1×5

   -0.6490    1.1812   -0.7585   -1.1096   -0.8456

... obtienes exactamente los mismos resultados. Puede hacer esto para recrear después de haberlo borrado, para que pueda repetir lo que sucede en los cálculos posteriores que dependen de, utilizando esos valores específicos.xx

Por otro lado, es posible que desee elegir las semillas para asegurarse de que no repita los mismos cálculos.different Por ejemplo, si ejecuta este código en una sesión de MATLAB...

rng(2) x2 = sum(randn(50,1000),1); % 1000 trials of a random walk

y este código en otro...

rng(3) x3 = sum(randn(50,1000),1);

... podría combinar los dos resultados y estar seguro de que no son simplemente los mismos resultados repetidos dos veces.

x = [x2 x3];

Al igual que con hay una advertencia al reinicializar el generador de números aleatorios de MATLAB, porque afecta a todos los resultados posteriores de, y.'shuffle'randrandirandn A menos que necesite repetibilidad o singularidad, por lo general es aconsejable generar simplemente valores aleatorios sin volver a inicializar el generador. Si necesita volver a sellar el generador, que normalmente se hace mejor en la línea de comandos, o en un lugar en el código que no se pasa por alto fácilmente.

Elegir un tipo de generador

No sólo se puede resellar el generador de números aleatorios como se muestra arriba, también se puede elegir el tipo de generador de números aleatorios que desea utilizar. Diferentes tipos de generadores producen diferentes secuencias de números aleatorios, y es posible, por ejemplo, elegir un tipo específico debido a sus propiedades estadísticas. O es posible que tenga que volver a crear los resultados de una versión anterior de MATLAB que utiliza un tipo de generador predeterminado diferente.

Otra razón común para elegir el tipo de generador es que está escribiendo una prueba de validación que genera datos de entrada "aleatorios" y necesita garantizar que la prueba siempre puede esperar exactamente el mismo resultado predecible. Si llama con un SEED antes de crear los datos de entrada, vuelve a sellar el generador de números aleatorios.rng Pero si el tipo de generador se ha cambiado por alguna razón, entonces la salida de,, y no será lo que esperas de esa semilla.randrandirandn Por lo tanto, para estar 100% seguro de repetibilidad, también puede especificar un tipo de generador.

Por ejemplo,

rng(0,'twister')

causas, y utilizar el algoritmo del generador de Mersenne Twister, después de la siembra con 0.randrandirandn

Usando'combRecursive'

rng(0,'combRecursive')

selecciona el algoritmo de generador recursivo múltiple combinado, que admite algunas características paralelas que el Mersenne Twister no.

Este comando

rng(0,'v4')

selecciona el algoritmo del generador que fue el predeterminado en MATLAB 4,0.

Y, por supuesto, este comando devuelve el generador de números aleatorios a su configuración predeterminada.

rng default

Sin embargo, debido a que la configuración predeterminada del generador de números aleatorios puede cambiar entre las versiones de MATLAB, el uso no garantiza resultados predecibles a largo plazo. es una forma conveniente de restablecer el generador de números aleatorios, pero para una mayor previsibilidad, especifique un tipo de generador y una semilla.'default''default'

Por otro lado, cuando se trabaja de forma interactiva y se necesita repetibilidad, es más sencillo, y por lo general suficiente, llamar solo con una semilla.rng

Guardar y restaurar la configuración del generador de números aleatorios

La llamada sin entradas devuelve una estructura escalar con campos que contienen dos fragmentos de información que ya se han descrito: el tipo de generador y el número entero con el que se ha vuelto a sellar el generador por última vez.rng

s = rng
s = struct with fields:
     Type: 'twister'
     Seed: 0
    State: [625x1 uint32]

El tercer campo, contiene una copia del vector de estado actual del generador.State Este vector de estado es la información que el generador mantiene internamente con el fin de generar el siguiente valor en su secuencia de números aleatorios. Cada vez que se llama, o, el generador que comparten actualiza su estado interno.randrandirandn Por lo tanto, el vector de estado en la estructura de configuración devuelta contiene la información necesaria para repetir la secuencia, comenzando desde el punto en el que se capturó el estado.rng

Mientras que sólo ser capaz de ver esta salida es informativa, también acepta una estructura de configuración como un, por lo que puede guardar la configuración, incluyendo el vector de estado, y restaurarlos más tarde para repetir los cálculos.rnginput Debido a que la configuración contiene el tipo de generador, sabrá exactamente lo que está obteniendo, por lo que "más tarde" podría significar cualquier cosa desde momentos posteriores en la misma sesión de MATLAB, hasta años (y varias versiones de MATLAB) más adelante. Puede repetir los resultados desde cualquier punto de la secuencia numérica aleatoria en la que guardó los ajustes del generador. Por ejemplo

x1 = randn(10,10); % move ahead in the random number sequence s = rng;           % save the settings at this point x2 = randn(1,5)
x2 = 1×5

    0.8404   -0.8880    0.1001   -0.5445    0.3035

x3 = randn(5,5);   % move ahead in the random number sequence rng(s);            % return the generator back to the saved state x2 = randn(1,5)    % repeat the same numbers
x2 = 1×5

    0.8404   -0.8880    0.1001   -0.5445    0.3035

Tenga en cuenta que, mientras que la reinicialización solo proporciona una reinicialización gruesa, guardar y restaurar el estado del generador mediante la estructura de configuración le permite repetir parte de la secuencia numérica aleatoria.any

La forma más común de utilizar una estructura de configuración es restaurar el estado del generador. Sin embargo, debido a que la estructura no sólo contiene el estado, sino también el tipo de generador y la semilla, también es una forma conveniente de cambiar temporalmente los tipos de generador. Por ejemplo, si necesita crear valores utilizando uno de los generadores heredados de MATLAB 5,0, puede guardar la configuración actual al mismo tiempo que cambia para usar el generador antiguo...

previousSettings = rng(0,'v5uniform')
previousSettings = struct with fields:
     Type: 'twister'
     Seed: 0
    State: [625x1 uint32]

... y luego restaure la configuración original más adelante.

rng(previousSettings)

No debe modificar el contenido de ninguno de los campos en una estructura de configuración. En particular, no debe construir su propio vector de estado, o incluso depender del formato del estado del generador.

Escritura más simple, más flexible, código

le permiterng

  • reselló el generador de números aleatorios, o

  • guardar y restaurar la configuración de generador de números aleatorios

sin tener que saber de qué tipo es. También puede devolver el generador de números aleatorios a su configuración predeterminada sin tener que saber cuáles son esos ajustes. Si bien hay situaciones en las que puede especificar un tipo de generador, le permite la simplicidad de no especificarlo.wantrnghaving

Si usted es capaz de evitar la especificación de un tipo de generador, el código se adaptará automáticamente a los casos donde un generador diferente necesita ser utilizado, y se beneficiará automáticamente de propiedades mejoradas en un nuevo tipo de generador de números aleatorios por defecto.

Modo heredado yrng

En las versiones de MATLAB anteriores a la 7,7, se controlaba el estado interno del generador de números aleatorios llamando o directamente con las entradas ' SEED ', ' State ' o ' TWISTER '.randrandn Por ejemplo,

rand('state',1234)

Esa sintaxis no se recomienda, y cambia MATLAB en "modo de número aleatorio heredado", donde y utilizar generadores separados y desactualizados, comportándose como lo hacían antes de MATLAB 7,7.randrandn Si es posible, debe actualizar cualquier código existente que utilice la sintaxis antigua para usar en su lugar.rng Para hacer eso, puede tomar algún pensamiento para determinar la verdadera intención del código antiguo; Consulte en la guía del usuario sugerencias y ejemplos.Actualización de la sintaxis del generador de números aleatorios

Si usted, o algún código ejecutado, ha ejecutado un comando como el que coloca MATLAB en el modo heredado, puede usarrand('state',1234)

rng default

para escapar del modo heredado y volver al generador de inicio predeterminado. Si hay código que no se puede o no se permite modificar, puede proteger alrededor de ese código antiguo mediante:

s = rng; % save current settings of the generator  % call code using legacy random number generator syntaxes  rng(s) % restore previous settings of the generator

para asegurarse de que ningún otro código utiliza los generadores de números aleatorios heredados.

YrngRandStream

proporciona una forma cómoda de controlar la generación aleatoria de números en MATLAB para las necesidades más comunes.rng Sin embargo, situaciones más complicadas que implican múltiples flujos de números aleatorios y la generación de números aleatorios paralelos requieren una herramienta más complicada. La clase es esa herramienta, y proporciona la manera más poderosa de controlar la generación de números aleatorios.RandStream Las dos herramientas son complementarias, proporcionando una sintaxis mucho más simple y concisa que se basa en la flexibilidad de.rngRandStream