# 25 Numerics library [numerics]

## 25.6 Random number generation [rand]

### 25.6.3 Random number engine class templates [rand.eng]

#### 25.6.3.1 Class template linear_­congruential_­engine[rand.eng.lcong]

A linear_­congruential_­engine random number engine produces unsigned integer random numbers.
The state x of a linear_­congruential_­engine object x is of size 1 and consists of a single integer.
The transition algorithm is a modular linear function of the form ; the generation algorithm is .
template<class UIntType, UIntType a, UIntType c, UIntType m>
class linear_congruential_engine {
public:
// types
using result_type = UIntType;

// engine characteristics
static constexpr result_type multiplier = a;
static constexpr result_type increment = c;
static constexpr result_type modulus = m;
static constexpr result_type min() { return c == 0u ? 1u: 0u; }
static constexpr result_type max() { return m - 1u; }
static constexpr result_type default_seed = 1u;

// constructors and seeding functions
linear_congruential_engine() : linear_congruential_engine(default_seed) {}
explicit linear_congruential_engine(result_type s);
template<class Sseq> explicit linear_congruential_engine(Sseq& q);
void seed(result_type s = default_seed);
template<class Sseq> void seed(Sseq& q);

// generating functions
result_type operator()();
};

If the template parameter m is 0, the modulus m used throughout this subclause [rand.eng.lcong] is numeric_­limits<result_­type>::max() plus 1.
[Note
:
m need not be representable as a value of type result_­type.
end note
]
If the template parameter m is not 0, the following relations shall hold: a < m and c < m.
The textual representation consists of the value of x.
explicit linear_congruential_engine(result_type s); 
Effects: Constructs a linear_­congruential_­engine object.
If is 0 and is 0, sets the engine's state to 1, otherwise sets the engine's state to .
template<class Sseq> explicit linear_congruential_engine(Sseq& q); 
Effects: Constructs a linear_­congruential_­engine object.
With and a an array (or equivalent) of length , invokes q.generate(, ) and then computes .
If is 0 and S is 0, sets the engine's state to 1, else sets the engine's state to S.