86 lines
3.8 KiB
Markdown
86 lines
3.8 KiB
Markdown
[rand.adapt.shuf]
|
||
|
||
# 29 Numerics library [[numerics]](./#numerics)
|
||
|
||
## 29.5 Random number generation [[rand]](rand#adapt.shuf)
|
||
|
||
### 29.5.5 Random number engine adaptor class templates [[rand.adapt]](rand.adapt#shuf)
|
||
|
||
#### 29.5.5.4 Class template shuffle_order_engine [rand.adapt.shuf]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L3688)
|
||
|
||
A shuffle_order_engine random number engine adaptor
|
||
produces the same random numbers
|
||
that are produced by some base engine e,
|
||
but delivers them in a different sequence[.](#1.sentence-1)
|
||
|
||
The state xi of a shuffle_order_engine engine adaptor object x consists of
|
||
the state ei of its base engine e,
|
||
an additional value Y of the type delivered by e,
|
||
and
|
||
an additional sequence V of k values
|
||
also of the type delivered by e[.](#1.sentence-2)
|
||
|
||
The size of the state is
|
||
the size of e's state plus k+1[.](#1.sentence-3)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L3704)
|
||
|
||
The transition algorithm
|
||
permutes the values produced by e[.](#2.sentence-1)
|
||
|
||
The state transition is performed as follows:
|
||
|
||
- [(2.1)](#2.1)
|
||
|
||
Calculate an integer j=âkâ(Yâemin)emaxâemin+1â [.](#2.1.sentence-1)
|
||
|
||
- [(2.2)](#2.2)
|
||
|
||
Set Y to Vj and then set Vj to e()[.](#2.2.sentence-1)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L3720)
|
||
|
||
The generation algorithm
|
||
yields the last value of Y produced while advancing e's state as described above[.](#3.sentence-1)
|
||
|
||
[ð](#lib:shuffle_order_engine_)
|
||
|
||
namespace std {template<class Engine, size_t k>class shuffle_order_engine {public:// typesusing result_type = typename Engine::result_type; // engine characteristicsstatic constexpr size_t table_size = k; static constexpr result_type min() { return Engine::min(); }static constexpr result_type max() { return Engine::max(); }// constructors and seeding functions shuffle_order_engine(); explicit shuffle_order_engine(const Engine& e); explicit shuffle_order_engine(Engine&& e); explicit shuffle_order_engine(result_type s); template<class Sseq> explicit shuffle_order_engine(Sseq& q); void seed(); void seed(result_type s); template<class Sseq> void seed(Sseq& q); // equality operatorsfriend bool operator==(const shuffle_order_engine& x, const shuffle_order_engine& y); // generating functions result_type operator()(); void discard(unsigned long long z); // property functionsconst Engine& base() const noexcept { return e; }// inserters and extractorstemplate<class charT, class traits>friend basic_ostream<charT, traits>&operator<<(basic_ostream<charT, traits>& os, const shuffle_order_engine& x); template<class charT, class traits>friend basic_istream<charT, traits>&operator>>(basic_istream<charT, traits>& is, shuffle_order_engine& x); private: Engine e; // *exposition only* result_type V[k]; // *exposition only* result_type Y; // *exposition only*};}
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L3776)
|
||
|
||
The following relation shall hold: 0 < k[.](#4.sentence-1)
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L3780)
|
||
|
||
The textual representation
|
||
consists of
|
||
the textual representation of e,
|
||
followed by
|
||
the k values of V,
|
||
followed by
|
||
the value of Y[.](#5.sentence-1)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L3789)
|
||
|
||
In addition to its behavior
|
||
pursuant to subclause [[rand.req.adapt]](rand.req.adapt "29.5.3.5 Random number engine adaptor requirements"),
|
||
each constructor that is not a copy constructor
|
||
initializes V[0], …, V[k - 1] and Y,
|
||
in that order,
|
||
with values returned by successive invocations of e()[.](#6.sentence-1)
|