Main Content

La traducción de esta página está obsoleta. Haga clic aquí para ver la última versión en inglés.

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 y randn 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í.

Generator = 'seed' se refiere al generador de MATLAB v4, no a la semilla.

Generator = 'state' se refiere al generador de MATLAB v5, no al estado interno del generador.

Generator = 'twister' se refiere al generador Mersenne twister, ahora el generador de inicio de MATLAB.

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/randnNombre del generador rng
'seed''v4'
'state'

'v5uniform' (para rand)
o
'v5normal' (para randn)

'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 y randn.

  • 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 entrada Generator, rand, randn y randi solo utilizarán el generador predeterminado Mersenne twister que se usa al inicio de MATLAB. En futuras versiones, cuando los nuevos generadores sustituyan a Mersenne twister, este código usará el nuevo valor predeterminado.

Sintaxis no recomendada de rand/randnNo recomendado: Reproducir el comportamiento no recomendado exactamente especificando 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')

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/randnNueva 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 por rand('seed', ...)

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

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

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

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

  • El generador 'v5normal', controlado por randn('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.

Consulte también

| |

Temas relacionados