Subtract-with-carry is a pseudorandom number generator: one of many algorithms designed to produce a long series of random-looking numbers based on a small amount of starting data. It is of the lagged Fibonacci type introduced by George Marsaglia and Arif Zaman in 1991.[1] "Lagged Fibonacci" refers to the fact that each random number is a function of two of the preceding numbers at some specified, fixed offsets, or "lags".
Sequence generated by the subtract-with-carry engine may be described by the recurrence relation:
x(i)=(x(i-S)-x(i-R)-cy(i-1)) \bmod M
where
cy(i)=\begin{cases} 1,&ifx(i-S)-x(i-R)-cy(i-1)<0\\ 0,&otherwise \end{cases}
Constants S and R are known as the short and long lags, respectively.[2] Therefore, expressions
x(i-S)
x(i-R)
0<S<R
M=2W
W>0
The subtract-with-carry engine is one of the family of generators which includes as well add-with-carry and subtract-with-borrow engines.[1]
It is one of three random number generator engines included in the standard C++11 library.[3]