The topic you requested is included in another documentation set. For convenience, it's displayed below. Choose Switch to see the topic in its original location.
We recommend using Visual Studio 2017

subtract_with_carry_engine Class


The latest version of this topic can be found at subtract_with_carry_engine Class.

Generates a random sequence by the subtract-with-carry (lagged Fibonacci) algorithm.

template <class UIntType, size_t W, size_t S, size_t R>  
class subtract_with_carry_engine;  


The unsigned integer result type. For possible types, see <random>.

Word size. Size of each word, in bits, of the state sequence. Precondition: 0 < W ≤ numeric_limits<UIntType>::digits

Short lag. Number of integer values. Precondition: 0 < S < R

Long lag. Determines recurrence in the series generated.

default_seed is a member constant, defined as 19780503u, used as the default parameter value for subtract_with_carry_engine::seed and the single value constructor.

For more information about engine members, see <random>.

The substract_with_carry_engine template class is an improvement over the linear_congruential_engine. Neither for these engines is as fast or with as high quality results as the mersenne_twister_engine.

This engine produces values of a user-specified unsigned integral type using the recurrence relation ( period) x(i) = (x(i - R) - x(i - S) - cy(i - 1)) mod M, where cy(i) has the value 1 if x(i - S) - x(i - R) - cy(i - 1) < 0, otherwise 0, and M has the value 2W. The engine's state is a carry indicator plus R values. These values consist of the last R values returned if operator() has been called at least R times, otherwise the N values that have been returned and the last R - N values of the seed.

The template argument UIntType must be large enough to hold values up to M - 1.

Although you can construct a generator from this engine directly, you can also use one of these predefined typedefs:

ranlux24_base: Used as a base for ranlux24.
typedef subtract_with_carry_engine<unsigned int, 24, 10, 24> ranlux24_base;

ranlux48_base: Used as a base for ranlux48.
typedef subtract_with_carry_engine<unsigned long long, 48, 5, 12> ranlux48_base;

For detailed information about the subract with carry engine algorithm, see the Wikipedia article Lagged Fibonacci generator.

Header: <random>

Namespace: std