89 lines
3.8 KiB
Markdown
89 lines
3.8 KiB
Markdown
[rand.eng.lcong]
|
||
|
||
# 29 Numerics library [[numerics]](./#numerics)
|
||
|
||
## 29.5 Random number generation [[rand]](rand#eng.lcong)
|
||
|
||
### 29.5.4 Random number engine class templates [[rand.eng]](rand.eng#lcong)
|
||
|
||
#### 29.5.4.2 Class template linear_congruential_engine [rand.eng.lcong]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L2670)
|
||
|
||
A linear_congruential_engine random number engine
|
||
produces unsigned integer random numbers[.](#1.sentence-1)
|
||
|
||
The state xi of a linear_congruential_engine object x is of size 1 and consists of a single integer[.](#1.sentence-2)
|
||
|
||
The transition algorithm
|
||
is a modular linear function of the formTA(xi)=(aâxi+c)modm;
|
||
the generation algorithm
|
||
is GA(xi)=xi+1[.](#1.sentence-3)
|
||
|
||
[ð](#lib:linear_congruential_engine_)
|
||
|
||
namespace std {template<class UIntType, UIntType a, UIntType c, UIntType m>class linear_congruential_engine {public:// typesusing result_type = UIntType; // engine characteristicsstatic 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); // equality operatorsfriend bool operator==(const linear_congruential_engine& x, const linear_congruential_engine& y); // generating functions result_type operator()(); void discard(unsigned long long z); // inserters and extractorstemplate<class charT, class traits>friend basic_ostream<charT, traits>&operator<<(basic_ostream<charT, traits>& os, // hostedconst linear_congruential_engine& x); template<class charT, class traits>friend basic_istream<charT, traits>&operator>>(basic_istream<charT, traits>& is, // hosted linear_congruential_engine& x); };}
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L2729)
|
||
|
||
If the template parameterm is 0,
|
||
the modulus m used throughout [rand.eng.lcong]
|
||
is numeric_limits<result_type>::max() plus 1[.](#2.sentence-1)
|
||
|
||
[*Note [1](#note-1)*:
|
||
|
||
m need not be representable
|
||
as a value of type result_type[.](#2.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L2740)
|
||
|
||
If the template parameterm is not 0,
|
||
the following relations shall hold: a < m and c < m[.](#3.sentence-1)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L2748)
|
||
|
||
The textual representation
|
||
consists of
|
||
the value of xi[.](#4.sentence-1)
|
||
|
||
[ð](#lib:linear_congruential_engine,constructor)
|
||
|
||
`explicit linear_congruential_engine(result_type s);
|
||
`
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L2759)
|
||
|
||
*Effects*: If cmodm is 0 and smodm is 0,
|
||
sets the engine's state to 1,
|
||
otherwise sets the engine's state to smodm[.](#5.sentence-1)
|
||
|
||
[ð](#lib:linear_congruential_engine,constructor_)
|
||
|
||
`template<class Sseq> explicit linear_congruential_engine(Sseq& q);
|
||
`
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L2772)
|
||
|
||
*Effects*: With k=âlog2m32â and a an array (or equivalent)
|
||
of length k+3,
|
||
invokes q.generate(a+0, a+k+3) and then computes S=(âkâ1j=0aj+3â232j)modm[.](#6.sentence-1)
|
||
|
||
If cmodm is 0 and S is 0,
|
||
sets the engine's state to 1,
|
||
else sets the engine's state
|
||
to S[.](#6.sentence-2)
|