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.

Reemplazar Syntaxes desalentados de Rand y randn

Descripción de la sintaxis desalentada

En versiones anteriores de, se controlaba el generador de números aleatorios utilizado por el y funciones con el, o entradas.MATLAB®randrandn'seed''state''twister' Por ejemplo:

rand('seed',sd) randn('seed',sd) rand('state',s) randn('state',s) rand('twister',5489) 

Estas sintaxis se refieren a diferentes tipos de generadores, y ya no se recomiendan por las siguientes razones:

  • Los términos y son nombres engañosos para los generadores.'seed''state'

  • Todos los generadores excepto son defectuosos.'twister'

  • Utilizan innecesariamente diferentes generadores para y.randrandn

Para evaluar el impacto de reemplazar las sintaxis desalentados en el código existente, ejecute los siguientes comandos al inicio de la sesión:MATLAB

warning('on','MATLAB:RandStream:ActivatingLegacyGenerators') warning('on','MATLAB:RandStream:ReadingInactiveLegacyGeneratorState') 

Descripción de Syntaxes de reemplazo

Utilice la función para controlar el generador compartido utilizado por, y todas las demás funciones de generación de números aleatorios como,, y así sucesivamente.rngrandrandnrandirandpermsprand Para aprender a usar la función al reemplazar sintaxis desalentada, tómese unos momentos para entender su función.rng Esto debería ayudarte a ver qué nueva sintaxis se adapta mejor a tus necesidades.rng

La primera entrada o especifica el tipo del generador, como se describe aquí.rand(Generator,s)randn(Generator,s)

Generator = 'seed' referido al generador, no al valor de inicialización de semilla.MATLABv4

Generator = 'state' referido a los generadores, no al estado interno del generador.MATLABv5

Generator = 'twister' referido al generador de Mersenne Twister, ahora el generador de arranque.MATLAB

Los generadores y ya no se recomiendan a menos que usted está tratando de reproducir exactamente los números aleatorios generados en versiones anteriores de.v4v5MATLAB La forma más sencilla de actualizar el código es usar.rng La función reemplaza los nombres de los generadores y los siguientes.rngrandrandn

Rand/randn generador nombreRNG nombre del generador
'seed''v4'
'state'

(para) o (para)'v5uniform'rand

'v5normal'randn

'twister'recomienda'twister'

Sintaxis de reemplazo para inicializar el generador con una semilla de enteros

Los usos más comunes de la semilla de enteros en la sintaxis eran:sdrand(Generator,sd)

  • Reproduzca exactamente los mismos números aleatorios cada vez (p. ej., utilizando una semilla como 0, 1 o 3141879)

  • Trate de asegurarse de que siempre da diferentes números aleatorios en ejecuciones separadas (por ejemplo, mediante el uso de una semilla como)MATLABsum(100*clock)

En la tabla siguiente se muestran los reemplazos de sintaxis con un entero de inicialización.sd

  • La primera columna muestra la sintaxis desalentada con y.randrandn

  • La segunda columna muestra cómo reproducir exactamente el comportamiento desalentado con la nueva función.rng En la mayoría de los casos, esto se hace especificando un tipo de generador heredado, como los generadores V4 o V5, que ya no se recomienda.

  • La tercera columna muestra la alternativa recomendada, que no especifica la entrada de tipo generador opcional.rng Por lo tanto, si se omite la entrada,,, y simplemente utilizar el generador Mersenne Twister por defecto que se utiliza en el arranque.alwaysGeneratorrandrandnrandiMATLAB En versiones futuras cuando los nuevos generadores sustituyan al Mersenne Twister, este código usará el nuevo valor predeterminado.

La sintaxis de Rand/randn desalentadaNo recomendado: Reproducir el comportamiento desalentado especificando exactamente el tipo de generadorAlternativa recomendada: No reemplaza el tipo de generador
rand('twister',5489)rng(5489,'twister')rng('default')
rand('seed',sd)rng(sd,'v4')rng(sd)
randn('seed',sd)
rand('state',sd)rng(sd,'v5uniform')
randn('state',sd)rng(sd,'v5normal')
rand('seed',sum(100*clock))rng(sum(100*clock),'v4')rng('shuffle')

Syntaxes de reemplazo para inicializar el generador con un vector de estado

El uso más común del vector de estado (mostrado aquí como) en la sintaxis era reproducir exactamente los números aleatorios generados en un punto específico en un algoritmo o iteración.strand(Generator,st) Por ejemplo, podría utilizar este vector como ayuda en la depuración.

La función cambia el patrón de guardar y restaurar el estado del generador de números aleatorios como se muestra en la siguiente tabla.rng En el ejemplo de la columna de la izquierda se presupone que está utilizando el generador uniforme.v5 El ejemplo de la columna de la derecha utiliza la nueva sintaxis y funciona para cualquier generador que utilice.

Sintaxis desalentada mediante Rand/randnNueva sintaxis utilizando RNG
% Save v5 generator state. st = rand('state');  % Call rand. x = rand;  % Restore v5 generator state. rand('state',st);  % Call rand again and hope  % for the same results. y = rand
% Get generator settings. s = rng;  % Call rand. x = rand;  % Restore previous generator  % settings. rng(s);  % Call rand again and  % get the same results. y = rand

Para una demostración, vea esta instrucción.Video

Si no puede actualizar de la sintaxis desalentada

Si hay código que no se puede o no se permite modificar y sabe que utiliza la sintaxis de control de generador de números aleatorios desalentados, es importante recordar que cuando se utiliza ese código se cambiará a.MATLABmodo heredado En el modo heredado, y son controlados por generadores separados, cada uno con su propia configuración.randrandn

Las llamadas en modo heredado utilizan uno de los siguientes:rand

  • El generador, controlado por'v4'rand('seed', ...)

  • El generador, controlado por'v5uniform'rand('state', ...)

  • El generador, controlado por'twister'rand('twister', ...)

Las llamadas en modo heredado utilizan uno de los siguientes:randn

  • El generador, controlado por'v4'randn('seed', ...)

  • El generador, controlado por'v5normal'randn('state', ...)

Si el código en el que se basa pone en modo heredado, utilice el siguiente comando para escapar del modo heredado y volver al generador de inicio predeterminado:MATLAB

rng default

Alternativamente, para proteger alrededor del código que pone en el modo heredado, utilice:MATLAB

s = rng     % Save current settings of the generator.   ...       % Call code using legacy random number generator syntaxes. rng(s)      % Restore previous settings of the generator.