Articulo de referencia

Restar con acarreo

El generador de números pseudoaleatorios Subtract-with-carry (SWC) fue creado por George Marsaglia y Arif Zaman en 1991. [ 1 ] Pertenece a una clase de generadores conocidos com...

El generador de números pseudoaleatorios Subtract-with-carry (SWC) fue creado por George Marsaglia y Arif Zaman en 1991. [ 1 ] Pertenece a una clase de generadores conocidos como generadores de Fibonacci retardados , donde cada nuevo número en la secuencia es una función de dos números anteriores a distancias fijas ("retrasos").

SWC es uno de los tres motores de generación de números aleatorios incluidos en la biblioteca estándar de C++11 . [ 2 ] Pertenece a una familia de generadores que también incluye motores de suma con acarreo y resta con préstamo . [ 1 ]

Algoritmo

El estado del algoritmo de resta con acarreo se define mediante una lista de R números y un valor de "acarreo", donde R es el "retraso largo". Los valores iniciales para este estado, conocidos como "semilla", pueden elegirse arbitrariamente.

Para generar el siguiente número en la secuencia, el algoritmo utiliza dos valores de su lista de estados: el valor en la posición de "retardo corto" ( S pasos atrás) y el valor en la posición de "retardo largo" ( R pasos atrás). El nuevo número se calcula restando el valor del retardo largo y el bit de acarreo actual del valor del retardo corto. [ 3 ]

Si esta resta da como resultado un número negativo (un "préstamo"), el resultado se ajusta sumando una constante grande M (el módulo), y el acarreo para el siguiente paso se establece en 1. De lo contrario, el acarreo se establece en 0. El número recién generado reemplaza al número más antiguo de la lista y el proceso se repite.

Ejemplo

Un ejemplo sencillo puede ilustrar el proceso. Sean los parámetros:

  • Módulo M = 10
  • Retardo largo R = 3
  • Retardo corto S = 1
  • Estado inicial (semilla): una lista de 3 númerosincógnita=(incógnita0,incógnita1,incógnita2)=(6,8,3){\displaystyle x=(x_{0},x_{1},x_{2})=(6,8,3)}y un acarreo inicialdo2=0{\displaystyle c_{2}=0}.

Para generar el siguiente número,incógnita3{\displaystyle x_{3}}:

  1. Identificar el valor de retardo cortoincógnita3S=incógnita2=3{\displaystyle x_{3-S}=x_{2}=3}y el valor de retardo largoincógnita3R=incógnita0=6{\displaystyle x_{3-R}=x_{0}=6}.
  2. Realiza la resta:incógnita2incógnita0do2{\displaystyle x_{2}-x_{0}-c_{2}}360=3{\displaystyle 3-6-0=-3}.
  3. Como el resultado es negativo, se produce un préstamo. El nuevo acarreodo3{\displaystyle c_{3}}se convierte en 1.
  4. El nuevo númeroincógnita3{\displaystyle x_{3}}es el resultado módulo M :3mod10=7{\displaystyle -3\mod 10=7}.
  5. El estado se actualiza. La lista se convierte en(incógnita1,incógnita2,incógnita3)=(8,3,7){\displaystyle (x_{1},x_{2},x_{3})=(8,3,7)}y el acarreo ahora es 1 para el siguiente paso.

Este proceso puede repetirse para generar una larga secuencia de números pseudoaleatorios.

Definición formal

La secuencia generada por el motor de resta con acarreo se describe mediante la relación de recurrencia :

incógnita(i)=(incógnita(iS)incógnita(iR)doy(i1)) mod METRO{\displaystyle x(i)=(x(iS)-x(iR)-cy(i-1))\ {\bmod {\ }}M}

donde el nuevo portador,doy(i){\displaystyle cy(i)}, se define como:

doy(i)={1,si incógnita(iS)incógnita(iR)doy(i1)<00,de lo contrario{\displaystyle cy(i)={\begin{cases}1,&{\text{si }}x(iS)-x(iR)-cy(i-1)<0\\0,&{\text{en otro caso}}\end{cases}}}

Los retardos deben satisfacer la condición0<S<R{\displaystyle 0<S<R}. El módulo M suele ser una potencia de 2, como por ejemploMETRO=2W{\displaystyle M=2^{W}}, donde W es el tamaño de palabra de la secuencia de estado en bits. [ 1 ]

Referencias

  1. 1 2 3 Una nueva clase de generadores de números aleatorios , George Marsaglia y Arif Zaman, The Annals of Applied Probability, vol. 1, n.º 3, 1991
  2. std::subtract_with_carry_engine , cppreference.com
  3. Clase subtract_with_carry_engine , Microsoft Visual Studio 2015