Sustituir sintaxis no recomendadas de rand y randn
Descripción de las sintaxis no recomendadas
En anteriores versiones de MATLAB®, podía controlar el generador de números aleatorios que utilizaban las funciones rand
y randn
con las entradas 'seed'
, 'state'
o 'twister'
. Por ejemplo:
rand('seed',sd) randn('seed',sd) rand('state',s) randn('state',s) rand('twister',5489)
Estas sintaxis se refieren a distintos tipos de generadores, y han dejado de recomendarse por las siguientes razones:
Los términos
'seed'
y'state'
son nombres confusos para los generadores.Todos los generadores excepto
'twister'
son erróneos.Utilizan generadores diferentes para
rand
yrandn
de forma innecesaria.
Para evaluar el impacto de sustituir las sintaxis no recomendadas en su código, ejecute los siguientes comandos al iniciar sesión en MATLAB:
warning('on','MATLAB:RandStream:ActivatingLegacyGenerators') warning('on','MATLAB:RandStream:ReadingInactiveLegacyGeneratorState')
Descripción de las sintaxis de sustitución
Utilice la función rng
para controlar el generador compartido que utilizan rand
, randn
, randi
y el resto de funciones de generación de números aleatorios como randperm
, sprand
y demás. Para aprender a usar la función rng
al remplazar las sintaxis no recomendadas, dedique un momento a comprender su función. Esto le ayudará a saber qué nueva sintaxis rng
es más apropiada para sus necesidades.
La primera entrada de rand(Generator,s)
o randn(Generator,s)
especifica el tipo de generador, como se describe aquí.
|
Los generadores v4
y v5
han dejado de recomendarse a no ser que se proponga reproducir exactamente los números aleatorios generados en versiones anteriores de MATLAB. La forma más sencilla de actualizar el código es utilizar rng
. La función rng
sustituye los nombres de los generadores rand
y randn
de la siguiente manera.
Nombre del generador rand/randn | Nombre del generador rng |
---|---|
'seed' | 'v4' |
'state' |
|
'twister' | 'twister' (recomendado) |
Sintaxis de sustitución para iniciar el generador con una semilla entera
Los usos más comunes de la semilla entera sd
en la sintaxis rand(Generator,sd)
servían para:
Reproducir exactamente los mismos números aleatorios cada vez (por ejemplo utilizando una semilla como 0, 1 o 3141879)
Intentar garantizar que MATLAB siempre ofrezca números aleatorios diferentes en ejecuciones independientes (por ejemplo, usando una semilla como
sum(100*clock)
)
La siguiente tabla muestra sustituciones para sintaxis con una semilla entera sd
.
La primera columna muestra las sintaxis no recomendadas con
rand
yrandn
.La segunda columna muestra cómo reproducir exactamente el comportamiento no recomendado 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 ahora no se recomiendan.La tercera columna muestra la alternativa recomendada, que no especifica la entrada del tipo de generador opcional para
rng
. Por lo tanto, si siempre omite la entradaGenerator
,rand
,randn
yrandi
solo utilizarán el tipo de generador predeterminado y el valor de la semilla. En las versiones anteriores a R2023b, el tipo de generador predeterminado que se usaba en el inicio de MATLAB era el generador Mersenne Twister con una semilla de 0. A partir de la versión R2023b, puede cambiar la semilla y algoritmo predeterminados para el generador de números aleatorios en las preferencias de MATLAB. Para obtener más información, consulterng
.
Sintaxis no recomendada de rand/randn | No recomendado: Reproducir el comportamiento no recomendado exactamente especificando el tipo de generador | Alternativa 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') |
Sintaxis de sustitución para iniciar el generador con un vector estado
El uso más habitual de un vector estado (que aquí se muestra como st
) en la sintaxis rand(Generator,st)
es reproducir los números aleatorios generados en un punto específico en un algoritmo o iteración. Por ejemplo, puede utilizar este vector como ayuda al depurar.
La función rng
cambia el patrón al de guardar y restaurar el estado del generador de números aleatorios como se muestra en la siguiente tabla. En el ejemplo de la columna de la izquierda se da por supuesto que está usando el generador uniforme v5
. En el ejemplo de la columna de la derecha se usa la nueva sintaxis y funciona con cualquier generador que utilice.
Sintaxis no recomendada para rand/randn | Nueva sintaxis para 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 |
Si desea ver una demostración, consulte este vídeo de instrucciones.
Si no es capaz de actualizar a partir de las sintaxis no recomendadas
Si hay código que no es capaz de modificar, o si no tiene permiso para hacerlo y sabe que utiliza la sintaxis no recomendada de control del generador de números aleatorios, es importante que recuerde que, cuando use ese código, MATLAB cambiará al modo heredado. En el modo heredado, rand
y randn
se controlan con generadores independientes, cada uno con su propia configuración.
Las llamadas a rand
en el modo heredado utilizan uno de los siguientes:
El generador
'v4'
, controlado porrand('seed', ...)
El generador
'v5uniform'
, controlado porrand('state', ...)
El generador
'twister'
, controlado porrand('twister', ...)
Las llamadas a randn
en el modo heredado utilizan uno de los siguientes:
El generador
'v4'
, controlado porrandn('seed', ...)
El generador
'v5normal'
, controlado porrandn('state', ...)
Si el código del que depende hace que MATLAB funcione en modo heredado, utilice el siguiente comando para abandonar dicho modo y volver al generador de inicio predeterminado:
rng('default')
Alternativamente, para restringir el código que hace que MATLAB funcione en modo heredado, utilice:
s = rng % Save current settings of the generator. ... % Call code using legacy random number generator syntaxes. rng(s) % Restore previous settings of the generator.