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úmerosy un acarreo inicial.
Para generar el siguiente número,:
- Identificar el valor de retardo cortoy el valor de retardo largo.
- Realiza la resta:→.
- Como el resultado es negativo, se produce un préstamo. El nuevo acarreose convierte en 1.
- El nuevo númeroes el resultado módulo M :.
- El estado se actualiza. La lista se convierte eny 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 :
donde el nuevo portador,, se define como:
Los retardos deben satisfacer la condición. El módulo M suele ser una potencia de 2, como por ejemplo, donde W es el tamaño de palabra de la secuencia de estado en bits. [ 1 ]
Referencias
- Generadores de números pseudoaleatorios