Каждый тип, созданный из шаблона класса, указанного в этом разделе,[rand.adapt] удовлетворяет требованиямrandom number engine adaptor типа.
Если не указано иное, сложность каждой функции, указанной в этом разделе,[rand.adapt] является постоянной.
Если не указано иное, ни одна функция, описанная в этом разделе, не[rand.adapt] вызывает исключение.
Каждая функция, описанная в этом разделе,[rand.adapt] которая имеет параметр функцииq типаSseq& для параметра типа шаблона с именемSseq , отличным от типа,seed_seq вызывает то, что и когдаq.generate вызывает вызов throw.
Описание предоставляется в этом разделе[rand.adapt] только для операций адаптера, которые не описаны в разделе,[rand.req.adapt] или для операций, для которых существует дополнительная семантическая информация. В частности, объявления для конструкторов копирования, для операторов присваивания копий, для операторов потоковой передачи и для операторов равенства и неравенства не показаны в резюме.
Каждый шаблон, указанный в этом разделе,[rand.adapt] требует удержания одного или нескольких отношений, включающих значение (значения) не относящихся к типу параметров шаблона. Программа, реализующая любой из этих шаблонов, плохо сформирована, если какая-либо такая требуемая взаимосвязь не выполняется.
discard_block_engine Случайным образом номера адаптер двигателя производит случайные числа , выбранные из производства некоторых базового двигателяe. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя и дополнительного целого числа . Размер государства равен размеру государства плюс . xidiscard_block_engine xei ene1
Алгоритм перехода отбрасывает все значения, кроме значений, из каждого блока значений, предоставленного . Переход между состояниями выполняется следующим образом: Если , переместите состояние из в и установите в . В любом случае, затем увеличивайте и продвигайте текущее состояние до .r>0 p≥r en≥re ei ei+p−rn 0neejej+1
Алгоритм генерации выдает значение, возвращенное последним вызовом состояния при продвижении , как описано выше.e()e
template<class Engine, size_t p, size_t r> class discard_block_engine { public: // types using result_type = typename Engine::result_type; // engine characteristics static constexpr size_t block_size = p; static constexpr size_t used_block = r; static constexpr result_type min() { return Engine::min(); } static constexpr result_type max() { return Engine::max(); } // constructors and seeding functions discard_block_engine(); explicit discard_block_engine(const Engine& e); explicit discard_block_engine(Engine&& e); explicit discard_block_engine(result_type s); template<class Sseq> explicit discard_block_engine(Sseq& q); void seed(); void seed(result_type s); template<class Sseq> void seed(Sseq& q); // generating functions result_type operator()(); void discard(unsigned long long z); // property functions const Engine& base() const noexcept { return e; }; private: Engine e; // exposition only int n; // exposition only };
В дополнение к своему поведению в соответствии с разделом[rand.req.adapt]каждый конструктор, который не является конструктором копирования, устанавливаетn значение0.
Anindependent_bits_engine адаптер сочетает в себе случайное число случайных чисел двигателей, которые производятся некоторым базовым двигателемe, таким образом , чтобы произвести случайные числа с заданным количеством битовw. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя ; размер государства - это размер российского государства. xiindependent_bits_enginexei ee
Алгоритмы перехода и генерации описываются следующими интегральными константами:
a)Пусть R=e.max() - e.min() + 1 и m=⌊log2R⌋.
b)С ,n как определено ниже, пусть w0=⌊w/n⌋, n0=n−wmodn, y0=2w0⌊R/2w0⌋и y1=2w0+1⌊R/2w0+1⌋.
c)Пусть n=⌈w/m⌉ тогда и только тогда, когда в результате соотношение R−y0≤⌊y0/n⌋ выполняется. Иначе пусть n=1+⌈w/m⌉.
[ Note: Отношение w=n0w0+(n−n0)(w0+1) всегда сохраняется. ] — end note
Алгоритм перехода выполняется путем вызова по мере необходимости для получения значений меньше чем и значений меньше чем .e()n0y0+e.min()n−n0y1+e.min()
Алгоритм генерации использует значения, полученные при продвижении состояния, как описано выше, чтобы получить количество, полученное, как если бы по следующему алгоритму: S
S = 0; for (k = 0; k≠n0; k += 1) { do u = e() - e.min(); while (u≥y0); S = 2w0⋅S+umod2w0; } for (k = n0; k≠n; k += 1) { do u = e() - e.min(); while (u≥y1); S = 2w0+1⋅S+umod2w0+1; }
template<class Engine, size_t w, class UIntType> class independent_bits_engine { public: // types using result_type = UIntType; // engine characteristics static constexpr result_type min() { return 0; } static constexpr result_type max() { return 2w−1; } // constructors and seeding functions independent_bits_engine(); explicit independent_bits_engine(const Engine& e); explicit independent_bits_engine(Engine&& e); explicit independent_bits_engine(result_type s); template<class Sseq> explicit independent_bits_engine(Sseq& q); void seed(); void seed(result_type s); template<class Sseq> void seed(Sseq& q); // generating functions result_type operator()(); void discard(unsigned long long z); // property functions const Engine& base() const noexcept { return e; }; private: Engine e; // exposition only };
shuffle_order_engine Случайным образом номер адаптера двигатель производит те же самые случайные числа, которые производятся некоторым базовым двигателемe, но доставляет их в другой последовательности. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя , дополнительное значение типа поставляемого и дополнительная последовательность из значений и типа поставляемого . Размер государства равен размеру государства плюс . xishuffle_order_engine xei eY eV k eek+1
Алгоритм перехода переставляет значения, создаваемые . Переход между состояниями выполняется следующим образом: e
Алгоритм генерации выдает последнее значение, полученное при продвижении , как описано выше.Ye
template<class Engine, size_t k> class shuffle_order_engine { public: // types using result_type = typename Engine::result_type; // engine characteristics static 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); // generating functions result_type operator()(); void discard(unsigned long long z); // property functions const Engine& base() const noexcept { return e; }; private: Engine e; // exposition only result_type V[k]; // exposition only result_type Y; // exposition only };
Текстовое представление состоит из текстового представления , за которым следуют значения , за которыми следует значение .ek VY
В дополнение к своему поведению в соответствии с разделом[rand.req.adapt], каждый конструктор, который не является конструктором копирования, инициализируетсяV[0],…,V[k-1] иYв этом порядке значениями, возвращаемыми последовательными вызовамиe().