29 Numerics library [numerics]

29.6 Random number generation [rand]

В этом подпункте определяется средство для генерации (псевдо-) случайных чисел.

В дополнении к нескольким утилитам, четыре категории субъектов описана: uniform random bit generators, random number engines, random number engine adaptors, и random number distributions. Эти классификации применимы к типам, которые удовлетворяют соответствующим требованиям, к объектам, экземплярам которых создаются из таких типов, и к шаблонам, создающим такие типы при создании экземпляров. [ Note: Эти сущности определены таким образом, чтобы разрешить привязку любого однородного объекта генератора случайных битов e в качестве аргумента к любому объекту распределения случайных чисел d, создавая таким образом объект функции с нулевым аргументом, такой как заданный bind(d,e). ]end note

Каждая из сущностей, указанных в этом подпункте, имеет ассоциированный объект, arithmetic type обозначенный как result_­type. В T качестве result_­type связанного с такой сущностью, эта сущность характеризуется:

  1. a)как boolean или эквивалентно как boolean-valued, если T есть bool;

  2. b)иначе как integral или эквивалентно как integer-valued, если numeric_­limits<T>​::​is_­integer есть true;

  3. c)иначе как floating или эквивалентно как real-valued.

В случае целочисленного значения объект может дополнительно характеризоваться как signed или unsigned, в соответствии с numeric_­limits<T>​::​is_­signed.

Если не указано иное, во всех описаниях вычислений в этом подпункте используются математические действительные числа.

В этом подпункте операторы bitand , bitor и xor обозначают соответствующие стандартные побитовые операции. Дальше:

  1. a)оператор rshift обозначает побитовый сдвиг вправо с нулевыми битами, появляющимися в старших битах результата, и

  2. b)оператор lshiftw обозначает побитовый сдвиг влево с нулевыми битами, появляющимися в младших битах результата, и чей результат всегда берется по модулю 2w.

29.6.1 Requirements [rand.req]

29.6.1.1 General requirements [rand.req.genl]

В этом подпункте [rand]эффект создания экземпляра шаблона:

  1. a)с параметром типа шаблона с именем Sseq undefined, если соответствующий аргумент шаблона не является cv-unqualified и удовлетворяет требованиям seed sequence.

  2. b)с параметром типа шаблона с именем URBG undefined, если соответствующий аргумент шаблона не является cv-unqualified и удовлетворяет требованиям uniform random bit generator.

  3. c)с параметром типа шаблона с именем Engine undefined, если соответствующий аргумент шаблона не является cv-unqualified и удовлетворяет требованиям random number engine.

  4. d)что параметр типа шаблона с именем RealType не определен , если соответствующий аргумент шаблона не резюме, неквалифицированное и один из float, doubleили long double.

  5. e)который имеет тип параметра шаблона с именем IntType не определен , если соответствующий аргумент шаблона не резюме, неквалифицированные и один из short, int, long, long long, unsigned short, unsigned int, unsigned long, или unsigned long long.

  6. f)что параметр типа шаблона с именем UIntType не определен , если соответствующий аргумент шаблона не резюме, неквалифицированное и один из unsigned short, unsigned int, unsigned longили unsigned long long.

В этом подпункте [rand]фразы вида « x является итератором определенного типа» должны интерпретироваться как эквивалентные более формальному требованию, что « x является значением типа, удовлетворяющим требованиям указанного типа итератора».

В этом подпункте [rand]должен быть объявлен любой конструктор, который может быть вызван с одним аргументом и который удовлетворяет требованиям, указанным в этом подпункте explicit.

29.6.1.2 Seed sequence requirements [rand.req.seedseq]

Является объектом , который потребляет последовательность целочисленных данных и производит требуемое число без знака целочисленных значений , на основе потребляемых данных. [ Такой объект предоставляет механизм, позволяющий избежать репликации потоков случайных значений. Это может быть полезно, например, в приложениях, требующих большого количества машин случайных чисел. ] seed sequence i 0i<232Note: end note

Класс S удовлетворяет требованиям начальной последовательности, если выражения, показанные в таблице 102 , действительны и имеют указанную семантику, а S также если они удовлетворяют всем другим требованиям этого раздела [rand.req.seedseq]. В этой таблице и в этом разделе:

  1. a)T тип, названный Sассоциированным result_­type;

  2. b)q является значением S и, r возможно, константным значением S;

  3. c)ib и ie являются итераторами ввода с целым числом без знака value_­type длиной не менее 32 бит;

  4. d)rb и re являются изменяемыми итераторами произвольного доступа с целым числом без знака value_­type не менее 32 бит;

  5. e)ob - итератор вывода; а также

  6. f)il это значение initializer_­list<T>.

Таблица 102 - Требования к последовательности посева
ВыражениеТип возвратаДо / после состоянияСложность
S​::​result_­type T T представляет собой , unsigned integer type по меньшей мере , 32 бита. время компиляции
S() Создает начальную последовательность с тем же начальным состоянием, что и все другие исходные последовательности типа, сконструированные по умолчанию S. постоянный
S(ib,ie) Создает начальную последовательность, имеющую внутреннее состояние, которое зависит от некоторых или всех битов предоставленной последовательности [ib,ie). O(ieib)
S(il) То же, что и S(il.begin(), il.end()). такой же как S(il.begin(), il.end())
q.generate(rb,re) void Ничего не делает, если rb == re. В противном случае заполняет предоставленную последовательность [rb,re) 32-битными величинами, которые зависят от последовательности, предоставленной конструктору, и, возможно, также зависят от истории generateпредыдущих вызовов. O(rerb)
r.size() size_­t Количество 32-битных единиц, которые будут скопированы при вызове r.param. постоянный
r.param(ob) void Копирует в указанное место назначения последовательность 32-битных единиц, которые могут быть предоставлены конструктору второго объекта типа S, и которые будут воспроизводить в этом втором объекте состояние, неотличимое от состояния первого объекта. O(r.size())

29.6.1.3 Uniform random bit generator requirements [rand.req.urng]

uniform random bit generator g Типа G является функция объекта возвращение целого числа без знака значения , такой , что каждое значение в диапазоне возможных результатов имеет ( в идеале) , равная вероятности быть возвращены. [ Note: Степень gприближения результатов к идеалу часто определяется статистически. ]end note

Класс G удовлетворяет требованиям a, uniform random bit generator если выражения, показанные в таблице 103 , действительны и имеют указанную семантику, а G также если удовлетворяет всем другим требованиям этого раздела [rand.req.urng]. В этой таблице и в этом разделе:

  1. a)T тип, названный Gассоциированным result_­type, и

  2. b)g это значение G.

Таблица 103 - Требования к генератору единых случайных битов
ВыражениеТип возвратаДо / после состоянияСложность
G​::​result_­type T T это unsigned integer type. время компиляции
g() T Возвращает значение в замкнутом интервале [G​::​min(), G​::​max()]. амортизированная постоянная
G​::​min() T Обозначает наименьшее значение, которое потенциально может вернуть operator(). время компиляции
G​::​max() T Обозначает наибольшее значение, которое потенциально может вернуть operator(). время компиляции

Следующее соотношение должно занимать: G​::​min() < G​::​max().

29.6.1.4 Random number engine requirements [rand.req.eng]

random number engine (Обычно сокращенно engine) e типа E является равномерной случайной генератор битов , что дополнительно отвечает требованиям (например, для посева , а также для ввода / вывода) , указанные в данном разделе.

В любой момент времени e имеет состояние ei для некоторого целого числа i0. При постройке e имеет исходное состояние e0. Состояние двигателя может быть установлено с помощью конструктора, seed функции, присваивания или подходящего operator>>.

Eспецификация должна определять:

  1. a)размер Eсостояния, кратный размеру result_­type, заданному как интегральное постоянное выражение;

  2. b) transition algorithm TA , с помощью которого e«s государства ei продвигаются к его successor state ei+1; а также

  3. c)с generation algorithm GA помощью которого состояние двигателя отображается на значение типа result_­type.

Класс, E который удовлетворяет требованиям a, uniform random bit generator также удовлетворяет требованиям a, random number engine если выражения, показанные в таблице 104 , действительны и имеют указанную семантику, а E также if удовлетворяет всем другим требованиям этого раздела [rand.req.eng]. В этой таблице и в этом разделе:

  1. a)T тип, названный Eассоциированным result_­type;

  2. b)e это значение E, v является именующим из E, x и y которые (возможно const) значения E;

  3. c)s значение T;

  4. d)q является lvalue, удовлетворяющим требованиям a seed sequence;

  5. e)z это значение типа unsigned long long;

  6. f)os - lvalue типа некоторой специализации шаблона класса basic_­ostream<charT, traits>; а также

  7. g)is - lvalue типа некоторой специализации шаблона класса basic_­istream<charT, traits>;

где charT и traits ограничены согласно пунктам [strings] и пунктам [input.output].

Таблица 104 - Требования к механизму случайных чисел
ВыражениеТип возвратаДо / после состоянияСложность
E() Создает механизм с тем же начальным состоянием, что и все другие механизмы типа, построенные по умолчанию E. O(size of state)
E(x) Создает движок, который сравнивает равный x. O(size of state)
E(s) Создает движок с начальным состоянием, определяемым s. O(size of state)
E(q)268 Создает движок с начальным состоянием, которое зависит от последовательности, созданной одним вызовом q.generate. q.generate такая же, как сложность вызываемой последовательности, длина которой равна размеру состояния
e.seed() void Postconditions: e == E(). такой же как E()
e.seed(s) void Postconditions: e == E(s). такой же как E(s)
e.seed(q) void Postconditions: e == E(q). такой же как E(q)
e() T Авансы eдержавотворческая ei к ei+1 =TA(ei) и возвращается GA(ei). за таблицу 103
e.discard(z) 269 void Авансы eдержавотворческих ei к ei+z любому способу эквивалентного z последовательным вызовов e(). не хуже сложности z последовательных звонков e()
x == y bool Этот оператор является отношением эквивалентности. С Sx и Sy как бесконечные последовательности значений, которые будут сгенерированы повторными вызовами в будущем, x() и y(), соответственно, возвращает true if Sx=Sy; иначе возвращается false. O(size of state)
x != y bool !(x == y). O(size of state)
os << x ссылка на тип os Если os.fmtflags задано значение ios_­base​::​dec|ios_­base​::​left и символ заполнения установлен на пробел, os выполняется запись в текстовое представление xтекущего состояния. В выводе соседние числа разделяются одним или несколькими пробелами. И символ - заполнитель не изменяются. Postconditions: os.fmtflags O(size of state)
is >> v ссылка на тип is Если is.fmtflags установлено в ios_­base​::​dec, устанавливает vсостояние, определяемое чтением его текстового представления из is. Если обнаружен неверный ввод, гарантирует, что vсостояние не изменится в результате операции и вызовов is.setstate(ios​::​failbit) (которые могут вызывать throw ios​::​failure ( [iostate.flags])). Если текстовое представление, записанное через, os << x было впоследствии прочитано через is >> v, то x == v при условии, что не было промежуточных вызовов of x или of v. Requires: is предоставляет текстовое представление, которое ранее было написано с использованием выходного потока, встроенная локаль которого была такой же, как и у is, и аргументы специализации шаблона charT и для которого traits были, соответственно, такими же, как у is. Неизменны. Postconditions: is.fmtflags O(size of state)

E должны соответствовать требованиям CopyConstructible и CopyAssignable типам. Каждая из этих операций должна быть по сложности не хуже O(size of state).

Этот конструктор (а также последующая соответствующая seed() функция) может быть особенно полезен для приложений, требующих большого количества независимых случайных последовательностей.

Эта операция распространена в пользовательском коде и часто может быть реализована специфичным для движка способом, чтобы обеспечить значительное улучшение производительности по сравнению с эквивалентным наивным циклом, который выполняет z последовательные вызовы e().

29.6.1.5 Random number engine adaptor requirements [rand.req.adapt]

random number engine adaptor (Обычно сокращенно adaptor) a типа A является случайным числом двигателя , который принимает значения , полученные с помощью какого - либо другого случайных чисел двигателя, и применяет алгоритм для этих значений для того , чтобы поставить последовательность значений с различными свойствами случайности. Двигатель b типа , B адаптированный таким образом, называется base engine в этом контексте. Выражение a.base() должно быть действительным и должно возвращать константную ссылку на aбазовый движок.

Требования к типу двигателя со случайным числом должны интерпретироваться следующим образом по отношению к типу адаптера двигателя со случайным числом.

A::A();

Effects: Базовый движок инициализируется, как если бы его конструктор по умолчанию.

bool operator==(const A& a1, const A& a2);

Returns: true если a1базовый двигатель равен a2базовому двигателю. В противном случае возвращается false.

A::A(result_type s);

Effects: Базовый движок инициализируется с помощью s.

template<class Sseq> A::A(Sseq& q);

Effects: Базовый движок инициализируется с помощью q.

void seed();

Effects: В b качестве базового движка вызывает b.seed().

void seed(result_type s);

Effects: В b качестве базового движка вызывает b.seed(s).

template<class Sseq> void seed(Sseq& q);

Effects: В b качестве базового движка вызывает b.seed(q).

A также должны удовлетворять следующим дополнительным требованиям:

  1. a)Сложность каждой функции не должна превышать сложность соответствующей функции, применяемой к базовому двигателю.

  2. b)Состояние A должно включать состояние его базового двигателя. Размер Aгосударства должен быть не меньше размера базового двигателя.

  3. c) AСостояние копирования (например, во время создания копии или назначения копии) должно включать в себя копирование состояния базового механизма A.

  4. d)Текстовое представление A должно включать текстовое представление его базового двигателя.

29.6.1.6 Random number distribution requirements [rand.req.dist]

random number distribution (Обычно сокращенно distribution) d типа D является функция объекта возвращение значения, которые распределены в соответствии с ассоциированным математическим probability density function p(z) или в соответствии с ассоциированным discrete probability function P(zi). Спецификация распределения определяет связанную с ним функцию вероятности p(z) или P(zi).

Соответствующая функция вероятности обычно выражается с помощью определенных поставляемых извне величин, известных как parameters of the distribution. Такие параметры распределения идентифицируются в этом контексте путем написания, например, p(z|a,b) или P(zi|a,b)для обозначения определенных параметров, или путем написания, например, p(z|{p}) или P(zi|{p}), для обозначения параметров распределения, p взятых в целом.

Класс D удовлетворяет требованиям a, random number distribution если выражения, показанные в таблице 105 , действительны и имеют указанную семантику, а if D и связанные с ним типы также удовлетворяют всем другим требованиям этого раздела [rand.req.dist]. В этой таблице и в этом разделе

  1. a)T тип, названный Dассоциированным result_­type;

  2. b)P тип, названный Dассоциированным param_­type;

  3. c)d это значение D, а также x и y являются (возможно const) значения D;

  4. d)glb и lub являются значениями T соответственно, соответствующими наибольшей нижней границе и наименьшей верхней границе значений, потенциально возвращаемых d's operator(), как определено текущими значениями dпараметров' s;

  5. e)p является (возможно const) значением P;

  6. f)g, g1и g2 являются l значениями типа, удовлетворяющими требованиям a uniform random bit generator;

  7. g)os - lvalue типа некоторой специализации шаблона класса basic_­ostream<charT, traits>; а также

  8. h)is - lvalue типа некоторой специализации шаблона класса basic_­istream<charT, traits>;

где charT и traits ограничены в соответствии с пунктами [strings] и [input.output].

Таблица 105 - Требования к распределению случайных чисел
ВыражениеТип возвратаДо / после состоянияСложность
D​::​result_­type T T это arithmetic type. время компиляции
D​::​param_­type P время компиляции
D() Создает распределение, поведение которого неотличимо от поведения любого другого вновь созданного по умолчанию распределения типа D. постоянный
D(p) Создает распределение, поведение которого неотличимо от поведения вновь созданного распределения, непосредственно из значений, используемых для построения p. такая же, как pи конструкция
d.reset() void Последующее использование d не зависит от значений, созданных каким-либо механизмом перед вызовом reset. постоянный
x.param() P Возвращает такое значение p , что D(p).param() == p. не хуже, чем сложность D(p)
d.param(p) void Postconditions: d.param() == p. не хуже, чем сложность D(p)
d(g) T С p=d.param(), последовательность чисел, возвращаемая последовательными вызовами одного и того же объекта g , случайным образом распределяется в соответствии с ассоциированной функцией p(z|{p}) или P(zi|{p}). амортизируемое постоянное количество вызовов g
d(g,p) T Последовательность чисел, возвращаемая последовательными вызовами одних g и тех же объектов, p случайным образом распределяется в соответствии с ассоциированной функцией p(z|{p}) или P(zi|{p})функцией. амортизируемое постоянное количество вызовов g
x.min() T Возврат glb. постоянный
x.max() T Возврат lub. постоянный
x == y bool Этот оператор является отношением эквивалентности. Возвращает true if x.param() == y.param() и S1=S2, где S1 и S2 - бесконечные последовательности значений, которые будут генерироваться, соответственно, повторными вызовами в будущем x(g1) и y(g2) всякий раз g1 == g2. В противном случае возвращается false. постоянный
x != y bool !(x == y). так же, как x == y.
os << x ссылка на тип os Записывает в os текстовое представление параметры и дополнительные внутренние данные x. И символ - заполнитель не изменяются. Postconditions: os.fmtflags
is >> d ссылка на тип is Восстанавливается из is параметров и дополнительных внутренних данных lvalue d. Если обнаружен неправильный ввод, гарантирует, что d операция и вызовы не изменят его is.setstate(ios​::​failbit) (что может вызвать throw ios​::​failure ( [iostate.flags])). Requires: is обеспечивает текстовое представление , которое было ранее написанным используя os которого пронизана локаль и чьи аргументы шаблона специализации типа в charT и traits были такими же , как те is. Неизменны. Postconditions: is.fmtflags

D должны удовлетворять требованиям CopyConstructible и CopyAssignable типам.

Последовательность чисел, полученная при повторных вызовах, d(g) должна быть независимой от любого вызова os << d или какой-либо const функции-члена D между любыми вызовами d(g).

Если текстовое представление написано с использованием os << x и это представление восстанавливается в тот же или другой объект y того же типа с использованием is >> y, повторные вызовы y(g) должны производить ту же последовательность чисел, что и повторные вызовы x(g).

Не указано, D​::​param_­type объявлен ли он как (вложенный) class или через typedef. В этом подпункте [rand]объявления D​::​param_­type используются в форме typedefs только для удобства изложения.

P должен удовлетворять требования CopyConstructible, CopyAssignableи EqualityComparable типов.

Для каждого из конструкторов, D принимающих аргументы, соответствующие параметрам распределения, P должен быть соответствующий конструктор, подчиняющийся тем же требованиям и принимающий аргументы, идентичные по количеству, типу и значениям по умолчанию. Более того, для каждой из функций-членов D этих возвращаемых значений, соответствующих параметрам распределения, P должна быть соответствующая функция-член с идентичным именем, типом и семантикой.

P иметь декларацию по форме

using distribution_type =  D;

29.6.2 Header <random> synopsis [rand.synopsis]

#include <initializer_list>

namespace std {
  // [rand.eng.lcong], class template linear_­congruential_­engine
  template<class UIntType, UIntType a, UIntType c, UIntType m>
    class linear_congruential_engine;

  // [rand.eng.mers], class template mersenne_­twister_­engine
  template<class UIntType, size_t w, size_t n, size_t m, size_t r,
           UIntType a, size_t u, UIntType d, size_t s,
           UIntType b, size_t t,
           UIntType c, size_t l, UIntType f>
    class mersenne_twister_engine;

  // [rand.eng.sub], class template subtract_­with_­carry_­engine
  template<class UIntType, size_t w, size_t s, size_t r>
    class subtract_with_carry_engine;

  // [rand.adapt.disc], class template discard_­block_­engine
  template<class Engine, size_t p, size_t r>
    class discard_block_engine;

  // [rand.adapt.ibits], class template independent_­bits_­engine
  template<class Engine, size_t w, class UIntType>
    class independent_bits_engine;

  // [rand.adapt.shuf], class template shuffle_­order_­engine
  template<class Engine, size_t k>
    class shuffle_order_engine;

  // [rand.predef], engines and engine adaptors with predefined parameters
  using minstd_rand0  = see below;
  using minstd_rand   = see below;
  using mt19937       = see below;
  using mt19937_64    = see below;
  using ranlux24_base = see below;
  using ranlux48_base = see below;
  using ranlux24      = see below;
  using ranlux48      = see below;
  using knuth_b       = see below;

  using default_random_engine = see below;

  // [rand.device], class random_­device
  class random_device;

  // [rand.util.seedseq], class seed_­seq
  class seed_seq;

  // [rand.util.canonical], function template generate_­canonical
  template<class RealType, size_t bits, class URBG>
    RealType generate_canonical(URBG& g);

  // [rand.dist.uni.int], class template uniform_­int_­distribution
  template<class IntType = int>
    class uniform_int_distribution;

  // [rand.dist.uni.real], class template uniform_­real_­distribution
  template<class RealType = double>
    class uniform_real_distribution;

  // [rand.dist.bern.bernoulli], class bernoulli_­distribution
  class bernoulli_distribution;

  // [rand.dist.bern.bin], class template binomial_­distribution
  template<class IntType = int>
    class binomial_distribution;

  // [rand.dist.bern.geo], class template geometric_­distribution
  template<class IntType = int>
    class geometric_distribution;

  // [rand.dist.bern.negbin], class template negative_­binomial_­distribution
  template<class IntType = int>
    class negative_binomial_distribution;

  // [rand.dist.pois.poisson], class template poisson_­distribution
  template<class IntType = int>
    class poisson_distribution;

  // [rand.dist.pois.exp], class template exponential_­distribution
  template<class RealType = double>
    class exponential_distribution;

  // [rand.dist.pois.gamma], class template gamma_­distribution
  template<class RealType = double>
    class gamma_distribution;

  // [rand.dist.pois.weibull], class template weibull_­distribution
  template<class RealType = double>
    class weibull_distribution;

  // [rand.dist.pois.extreme], class template extreme_­value_­distribution
  template<class RealType = double>
    class extreme_value_distribution;

  // [rand.dist.norm.normal], class template normal_­distribution
  template<class RealType = double>
    class normal_distribution;

  // [rand.dist.norm.lognormal], class template lognormal_­distribution
  template<class RealType = double>
    class lognormal_distribution;

  // [rand.dist.norm.chisq], class template chi_­squared_­distribution
  template<class RealType = double>
    class chi_squared_distribution;

  // [rand.dist.norm.cauchy], class template cauchy_­distribution
  template<class RealType = double>
    class cauchy_distribution;

  // [rand.dist.norm.f], class template fisher_­f_­distribution
  template<class RealType = double>
    class fisher_f_distribution;

  // [rand.dist.norm.t], class template student_­t_­distribution
  template<class RealType = double>
    class student_t_distribution;

  // [rand.dist.samp.discrete], class template discrete_­distribution
  template<class IntType = int>
    class discrete_distribution;

  // [rand.dist.samp.pconst], class template piecewise_­constant_­distribution
  template<class RealType = double>
    class piecewise_constant_distribution;

  // [rand.dist.samp.plinear], class template piecewise_­linear_­distribution
  template<class RealType = double>
    class piecewise_linear_distribution;
}

29.6.3 Random number engine class templates [rand.eng]

Каждый тип, созданный из шаблона класса, указанного в этом разделе, [rand.eng] удовлетворяет требованиям random number engine типа.

Если не указано иное, сложность каждой функции, указанной в этом разделе, [rand.eng] является постоянной.

Если не указано иное, ни одна функция, описанная в этом разделе, не [rand.eng] вызывает исключение.

Каждая функция, описанная в этом разделе, [rand.eng] которая имеет параметр функции q типа Sseq& для параметра типа шаблона с именем Sseq , отличным от типа, seed_­seq вызывает то, что и когда q.generate вызывает вызов throw.

Описания представлены в этом разделе [rand.eng] только для операций двигателя, которые не описаны, [rand.req.eng] или для операций, для которых имеется дополнительная семантическая информация. В частности, объявления для конструкторов копирования, для операторов присваивания копий, для операторов потоковой передачи и для операторов равенства и неравенства не показаны в резюме.

Каждый шаблон, указанный в этом разделе, [rand.eng] требует удержания одного или нескольких отношений, включающих значение (значения) не относящихся к типу параметров шаблона. Программа, реализующая любой из этих шаблонов, плохо сформирована, если какая-либо такая требуемая взаимосвязь не выполняется.

Для каждого механизма случайных чисел и для каждого адаптера механизма случайных чисел, X определенных в этом подпункте ( [rand.eng]) и в подпункте [rand.adapt]:

  • если конструктор

    template <class Sseq> explicit X(Sseq& q);

    вызывается с типом Sseq , который не квалифицируется как начальная последовательность, тогда этот конструктор не должен участвовать в разрешении перегрузки;

  • если функция-член

    template <class Sseq> void seed(Sseq& q);

    вызывается с типом Sseq , который не квалифицируется как начальная последовательность, то эта функция не должна участвовать в разрешении перегрузки.

Степень, в которой реализация определяет, что тип не может быть начальной последовательностью, не указана, за исключением того, что, как минимум, тип не должен квалифицироваться как начальная последовательность, если он неявно конвертируется в X​::​result_­type.

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

Механизм linear_­congruential_­engine случайных чисел производит беззнаковые целые случайные числа. Состояние из объекта имеет размер и состоит из одного целого числа. Алгоритм перехода представляет собой модульную линейную функцию формы ; алгоритм генерации есть . xi linear_­congruential_­engine x 1TA(xi)=(axi+c)modm GA(xi)=xi+1

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
    explicit linear_congruential_engine(result_type s = default_seed);
    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()();
    void discard(unsigned long long z);
  };

Если параметр шаблона m равен 0, модуль, m используемый в этом разделе, равен плюсу . [ не обязательно представлять как значение типа . ] [rand.eng.lcong] numeric_­limits<result_­type>​::​max() 1Note: m result_­typeend note

Если параметр шаблона m не равен 0, должны выполняться следующие отношения: a < m и c < m.

Текстовое представление состоит из значения xi.

explicit linear_congruential_engine(result_type s = default_seed);

Effects: Создает linear_­congruential_­engine объект. Если cmodm есть 0 и smodm есть 0, устанавливает состояние двигателя в 1, в противном случае устанавливает состояние двигателя в smodm.

template<class Sseq> explicit linear_congruential_engine(Sseq& q);

Effects: Создает linear_­congruential_­engine объект. С k=log2m32 и a массивом (или эквивалентом) длины k+3вызывает, q.generate(a+0, a+k+3) а затем вычисляет S=(k1j=0aj+3232j)modm. Если cmodm есть 0 и S есть 0, устанавливает состояние двигателя в 1, иначе устанавливает состояние двигателя в S.

29.6.3.2 Class template mersenne_­twister_­engine [rand.eng.mers]

Механизм mersenne_­twister_­engine случайных чисел 270 производит беззнаковые целые случайные числа в закрытом интервале [0,2w1]. Состояние из объекта имеет размер и состоит из последовательности из значений типа поставляемого ; все применяемые индексы следует брать по модулю .xi mersenne_­twister_­engine x n X n x X n

Алгоритм перехода использует сдвиговый регистр с обобщенной обратной связью, определяемый значениями сдвига и , значением поворота и условной xor-маской . Чтобы улучшить однородность результата, биты необработанного регистра сдвига дополнительно (т. Е. Скремблируются) в соответствии с матрицей битового скремблирования, определенной значениями и . n m r a tempered u,d,s,b,t,c,

Переход между состояниями выполняется следующим образом:

  1. a)Соедините верхние wr биты Xin с младшими r битами, Xi+1n чтобы получить беззнаковое целое число Y.

  2. b)С α=a(Ybitand1), установите Xi на Xi+mnxor(Yrshift1)xorα.

Последовательность X инициализируется с помощью множителя инициализации f.

Алгоритм генерации определяет беззнаковые целочисленные значения следующим образом, а затем выдает в качестве своего результата: z1,z2,z3,z4 z4

  1. a)Пусть z1=Xixor((Xirshiftu)bitandd).

  2. b)Пусть z2=z1xor((z1lshiftws)bitandb).

  3. c)Пусть z3=z2xor((z2lshiftwt)bitandc).

  4. d)Пусть z4=z3xor(z3rshift).

template<class UIntType, size_t w, size_t n, size_t m, size_t r,
         UIntType a, size_t u, UIntType d, size_t s,
         UIntType b, size_t t,
         UIntType c, size_t l, UIntType f>
  class mersenne_twister_engine {
  public:
    // types
    using result_type = UIntType;

    // engine characteristics
    static constexpr size_t word_size = w;
    static constexpr size_t state_size = n;
    static constexpr size_t shift_size = m;
    static constexpr size_t mask_bits = r;
    static constexpr UIntType xor_mask = a;
    static constexpr size_t tempering_u = u;
    static constexpr UIntType tempering_d = d;
    static constexpr size_t tempering_s = s;
    static constexpr UIntType tempering_b = b;
    static constexpr size_t tempering_t = t;
    static constexpr UIntType tempering_c = c;
    static constexpr size_t tempering_l = l;
    static constexpr UIntType initialization_multiplier = f;
    static constexpr result_type min() { return 0; }
    static constexpr result_type max() { return  2w1; }
    static constexpr result_type default_seed = 5489u;

    // constructors and seeding functions
    explicit mersenne_twister_engine(result_type value = default_seed);
    template<class Sseq> explicit mersenne_twister_engine(Sseq& q);
    void seed(result_type value = default_seed);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);
  };

Следующие соотношения должны занимать: 0 < m, m <= n, 2u < w, r <= w, u <= w, s <= w, t <= w, l <= w, w <= numeric_­limits<UIntType>​::​digits, a <= (1u<<w) - 1u, b <= (1u<<w) - 1u, c <= (1u<<w) - 1u, d <= (1u<<w) - 1u, и f <= (1u<<w) - 1u.

Текстовое представление о xi состоит из значений Xin,,Xi1, в таком порядке.

explicit mersenne_twister_engine(result_type value = default_seed);

Effects: Создает mersenne_­twister_­engine объект. Устанавливается Xn на valuemod2w. Затем итеративно для i=1n,,1, наборы Xi для

[f(Xi1xor(Xi1rshift(w2)))+imodn]mod2w.

Complexity: O(n).

template<class Sseq> explicit mersenne_twister_engine(Sseq& q);

Effects: Создает mersenne_­twister_­engine объект. With k=w/32 и a массив (или эквивалент) длины nkвызывает, q.generate(a+0, a+nk) а затем, итеративно для i=n,,1, устанавливает Xi значение (k1j=0ak(i+n)+j232j)mod2w. Наконец, если наиболее значимые wr биты Xn равны нуль, и если каждый из других в результате чего Xi это 0, изменяется Xn с 2w1.

Название этого механизма частично относится к свойству его периода: для правильно выбранных значений параметров период тесно связан с большим простым числом Мерсенна.

29.6.3.3 Class template subtract_­with_­carry_­engine [rand.eng.sub]

Механизм subtract_­with_­carry_­engine случайных чисел производит беззнаковые целые случайные числа.

Состояние из объекта имеет размера , и состоит из последовательности из целочисленных значений ; все применяемые индексы следует брать по модулю . Состояние дополнительно состоит из целого числа (известного как ) , значение которого равно или . xi subtract_­with_­carry_­engine xO(r) X r 0Xi<m=2w X r xi c carry 0 1

Переход между состояниями выполняется следующим образом:

  1. a)Пусть Y=XisXirc.

  2. b)Установите Xi на y=Ymodm. Установите c в 1, если Y<0, в противном случае установите c в 0.

[ Note: Этот алгоритм соответствует модульной линейной функции вида TA(xi)=(axi)modb, где b имеет вид mrms+1 и a=b(b1)/m. ]end note

Алгоритм генерации задается формулой , где - значение, полученное в результате улучшения состояния двигателя, как описано выше.GA(xi)=y y

template<class UIntType, size_t w, size_t s, size_t r>
  class subtract_with_carry_engine {
  public:
    // types
    using result_type = UIntType;

    // engine characteristics
    static constexpr size_t word_size = w;
    static constexpr size_t short_lag = s;
    static constexpr size_t long_lag = r;
    static constexpr result_type min() { return 0; }
    static constexpr result_type max() { return m1; }
    static constexpr result_type default_seed = 19780503u;

    // constructors and seeding functions
    explicit subtract_with_carry_engine(result_type value = default_seed);
    template<class Sseq> explicit subtract_with_carry_engine(Sseq& q);
    void seed(result_type value = default_seed);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);
  };

Следующие соотношения должны проводить: 0u < s, s < r, 0 < w, и w <= numeric_­limits<UIntType>​::​digits.

Текстовое представление состоит из значений в указанном порядке, за которыми следует . Xir,,Xi1 c

explicit subtract_with_carry_engine(result_type value = default_seed);

Effects: Создает subtract_­with_­carry_­engine объект. Устанавливает значения Xr,,X1в указанном ниже порядке в указанном ниже порядке. Если X1 есть, то 0устанавливается c в 1; в противном случае устанавливается c на 0.

Для того, чтобы установить значение Xk, первые построить e, А linear_­congruential_­engine объект, как если бы по следующему определению:

linear_congruential_engine<result_type,
                          40014u,0u,2147483563u> e(value == 0u ? default_seed : value);

Затем, чтобы установить каждый Xk, получить новые значения z0,,zn1 из n=w/32 последовательных вызовов e взятого по модулю 232. Установите Xk на (n1j=0zj232j)modm.

Complexity: Собственно nr заклинания e.

template<class Sseq> explicit subtract_with_carry_engine(Sseq& q);

Effects: Создает subtract_­with_­carry_­engine объект. With k=w/32 и a массив (или эквивалент) длины rkвызывает, q.generate(a+0, a+rk) а затем, итеративно для i=r,,1, устанавливает Xi значение (k1j=0ak(i+r)+j232j)modm. Если X1 есть, то 0устанавливается c в 1; в противном случае устанавливается c на 0.

29.6.4 Random number engine adaptor class templates [rand.adapt]

29.6.4.1 In general [rand.adapt.general]

Каждый тип, созданный из шаблона класса, указанного в этом разделе, [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] требует удержания одного или нескольких отношений, включающих значение (значения) не относящихся к типу параметров шаблона. Программа, реализующая любой из этих шаблонов, плохо сформирована, если какая-либо такая требуемая взаимосвязь не выполняется.

29.6.4.2 Class template discard_­block_­engine [rand.adapt.disc]

discard_­block_­engine Случайным образом номера адаптер двигателя производит случайные числа , выбранные из производства некоторых базового двигателя e. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя и дополнительного целого числа . Размер государства равен размеру государства плюс . xi discard_­block_­engine x ei e n e 1

Алгоритм перехода отбрасывает все значения, кроме значений, из каждого блока значений, предоставленного . Переход между состояниями выполняется следующим образом: Если , переместите состояние из в и установите в . В любом случае, затем увеличивайте и продвигайте текущее состояние до . r>0 pr e nr e ei ei+pr n 0 n e ej ej+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
  };

Имеют место следующие отношения: 0 < r и r <= p.

Текстовое представление состоит из текстового представления, за которым следует значение . e n

В дополнение к своему поведению в соответствии с разделом [rand.req.adapt]каждый конструктор, который не является конструктором копирования, устанавливает n значение 0.

29.6.4.3 Class template independent_­bits_­engine [rand.adapt.ibits]

An independent_­bits_­engine адаптер сочетает в себе случайное число случайных чисел двигателей, которые производятся некоторым базовым двигателем e, таким образом , чтобы произвести случайные числа с заданным количеством битов w. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя ; размер государства - это размер российского государства. xi independent_­bits_­engine x ei e e

Алгоритмы перехода и генерации описываются следующими интегральными константами:

  1. a)Пусть R=e.max() - e.min() + 1 и m=log2R.

  2. b)С , n как определено ниже, пусть w0=w/n, n0=nwmodn, y0=2w0R/2w0и y1=2w0+1R/2w0+1.

  3. c)Пусть n=w/m тогда и только тогда, когда в результате соотношение Ry0y0/n выполняется. Иначе пусть n=1+w/m.

[ Note: Отношение w=n0w0+(nn0)(w0+1) всегда сохраняется. ]end note

Алгоритм перехода выполняется путем вызова по мере необходимости для получения значений меньше чем и значений меньше чем . e() n0y0+e.min() nn0 y1+e.min()

Алгоритм генерации использует значения, полученные при продвижении состояния, как описано выше, чтобы получить количество, полученное, как если бы по следующему алгоритму: S

S = 0;
for (k = 0; kn0; k += 1)  {
 do u = e() - e.min(); while (uy0);
 S = 2w0S+umod2w0;
}
for (k = n0; kn; k += 1)  {
 do u = e() - e.min(); while (uy1);
 S = 2w0+1S+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 2w1; }

    // 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
  };

Имеют место следующие отношения: 0 < w и w <= numeric_­limits<result_­type>​::​digits.

Текстовое представление состоит из текстового представления . e

29.6.4.4 Class template shuffle_­order_­engine [rand.adapt.shuf]

shuffle_­order_­engine Случайным образом номер адаптера двигатель производит те же самые случайные числа, которые производятся некоторым базовым двигателем e, но доставляет их в другой последовательности. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя , дополнительное значение типа поставляемого и дополнительная последовательность из значений и типа поставляемого . Размер государства равен размеру государства плюс . xi shuffle_­order_­engine x ei e Y e V k e e k+1

Алгоритм перехода переставляет значения, создаваемые . Переход между состояниями выполняется следующим образом: e

  1. a)Вычислить целое число j=k(Yemin)emaxemin+1 .

  2. b)Набор Y для Vj и затем установить Vj в e().

Алгоритм генерации выдает последнее значение, полученное при продвижении , как описано выше. Y e

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
  };

Следующее соотношение должно занимать: 0 < k.

Текстовое представление состоит из текстового представления , за которым следуют значения , за которыми следует значение . e k V Y

В дополнение к своему поведению в соответствии с разделом [rand.req.adapt], каждый конструктор, который не является конструктором копирования, инициализируется V[0],,V[k-1] и Yв этом порядке значениями, возвращаемыми последовательными вызовами e().

29.6.5 Engines and engine adaptors with predefined parameters [rand.predef]

using minstd_rand0 = linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а minstd_­rand0 должен получить значение 1043618065.

using minstd_rand = linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а minstd_­rand должен получить значение 399268537.

using mt19937 = mersenne_twister_engine<uint_fast32_t, 32,624,397,31,0x9908b0df,11,0xffffffff,7,0x9d2c5680,15,0xefc60000,18,1812433253>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а mt19937 должен получить значение 4123659995.

using mt19937_64 = mersenne_twister_engine<uint_fast64_t, 64,312,156,31,0xb5026f5aa96619e9,29, 0x5555555555555555,17, 0x71d67fffeda60000,37, 0xfff7eee000000000,43, 6364136223846793005>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а mt19937_­64 должен получить значение 9981545732273789042.

using ranlux24_base = subtract_with_carry_engine<uint_fast32_t, 24, 10, 24>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux24_­base должен получить значение 7937952.

using ranlux48_base = subtract_with_carry_engine<uint_fast64_t, 48, 5, 12>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux48_­base должен получить значение 61839128582725.

using ranlux24 = discard_block_engine<ranlux24_base, 223, 23>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux24 должен получить значение 9901578.

using ranlux48 = discard_block_engine<ranlux48_base, 389, 11>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux48 должен получить значение 249142670248501.

using knuth_b = shuffle_order_engine<minstd_rand0,256>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а knuth_­b должен получить значение 1112339016.

using default_random_engine = implementation-defined;

Remarks: Выбор типа двигателя, названного этим, typedef определяется реализацией. [ Note: Реализация может выбрать этот тип на основе производительности, размера, качества или любой комбинации таких факторов, чтобы обеспечить, по крайней мере, приемлемое поведение двигателя для относительно случайного, неопытного и / или легкого использования. Поскольку разные реализации могут выбирать разные типы базовых механизмов, код, использующий это, typedef не должен генерировать идентичные последовательности для разных реализаций. ] end note

29.6.6 Class random_­device [rand.device]

random_­device Равномерный случайный бит генератор производит недетерминированные случайные числа.

Если ограничения реализации не позволяют генерировать недетерминированные случайные числа, реализация может использовать механизм случайных чисел.

class random_device {
public:
  // types
  using result_type = unsigned int;

  // generator characteristics
  static constexpr result_type min() { return numeric_limits<result_type>::min(); }
  static constexpr result_type max() { return numeric_limits<result_type>::max(); }

  // constructors
  explicit random_device(const string& token = implementation-defined);

  // generating functions
  result_type operator()();

  // property functions
  double entropy() const noexcept;

  // no copy functions
  random_device(const random_device& ) = delete;
  void operator=(const random_device& ) = delete;
};

explicit random_device(const string& token = implementation-defined);

Effects: Создает random_­device недетерминированный однородный объект генератора случайных битов. Семантика и значение token параметра по умолчанию определяются реализацией.271

Throws: Значение типа, определяемого реализацией, производное от, exception если random_­device не удалось инициализировать.

double entropy() const noexcept;

Returns: Если реализация использует механизм случайных чисел, возвращается 0.0. В противном случае возвращает оценку энтропии 272 для случайных чисел, возвращаемых operator()в диапазоне min() до log2(max()+1).

result_type operator()();

Returns: Недетерминированное случайное значение, равномерно распределенное между min() и max()включительно. Это определяется реализацией , как генерируются эти значения.

Throws: Значение типа, определяемого реализацией, полученное в exception случае, если не удалось получить случайное число.

Параметр предназначен для того, чтобы реализация могла различать разные источники случайности.

Если у устройства есть n состояния, соответствующие вероятности которых равны P0,,Pn1, энтропия устройства S определяется как
S=n1i=0PilogPi.

29.6.7 Utilities [rand.util]

29.6.7.1 Class seed_­seq [rand.util.seedseq]

class seed_seq {
public:
  // types
  using result_type = uint_least32_t;

  // constructors
  seed_seq();
  template<class T>
    seed_seq(initializer_list<T> il);
  template<class InputIterator>
    seed_seq(InputIterator begin, InputIterator end);

  // generating functions
  template<class RandomAccessIterator>
    void generate(RandomAccessIterator begin, RandomAccessIterator end);

  // property functions
  size_t size() const noexcept;
  template<class OutputIterator>
    void param(OutputIterator dest) const;

  // no copy functions
  seed_seq(const seed_seq& ) = delete;
  void operator=(const seed_seq& ) = delete;

private:
  vector<result_type> v;   // exposition only
};

seed_seq();

Effects: Создает seed_­seq объект, как если бы по умолчанию создавал его член v.

Throws: Ничего такого.

template<class T> seed_seq(initializer_list<T> il);

Requires: T должен быть целочисленным типом.

Effects: То же, что и seed_­seq(il.begin(), il.end()).

template<class InputIterator> seed_seq(InputIterator begin, InputIterator end);

Requires: InputIterator должны удовлетворять требованиям input iterator типа. Кроме того, iterator_­traits<InputIterator>​::​value_­type будет обозначать целочисленный тип.

Effects: Создает seed_­seq объект по следующему алгоритму:

for( InputIterator s = begin; s != end; ++s)
 v.push_back((*s)mod232);

template<class RandomAccessIterator> void generate(RandomAccessIterator begin, RandomAccessIterator end);

Requires: RandomAccessIterator должен соответствовать требованиям изменяемого random access iterator. Кроме того, iterator_­traits<RandomAccessIterator>​::​value_­type должен обозначать беззнаковый целочисленный тип, способный вместить 32-битные величины.

Effects: Ничего не делает, если begin == end. В противном случае, с помощью s=v.size() и n=endbeginзаполняет предоставленный диапазон в [begin,end) соответствии со следующим алгоритмом, в котором каждая операция должна выполняться по модулю 232, каждый примененный оператор индексации begin должен приниматься по модулю nи T(x) определяется как xxor(xrshift27):

  1. a)В качестве инициализации установите значение каждого элемента диапазона 0x8b8b8b8b. Кроме того, для использования на последующих этапах, пусть p=(nt)/2 и пусть q=p+t, где

    t=(n623) ? 11 : (n68) ? 7 : (n39) ? 5 : (n7) ? 3 : (n1)/2;

  2. b)С m как большее из s+1 и nпреобразовать элементы диапазона: итеративно для k=0,,m1, вычислить значения

    r1=1664525T(begin[k]xorbegin[k+p]xorbegin[k1])r2=r1+sk=0kmodn+v[k1]0<kskmodns<k

    и, по порядку, увеличить begin[k+p] на r1, увеличить begin[k+q] на r2и установить begin[k] в r2.

  3. c)Снова преобразовать элементы диапазона, начиная с того места, где закончился предыдущий шаг: итеративно для k=m,,m+n1, вычислить значения

    r3=1566083941T(begin[k]+begin[k+p]+begin[k1])r4=r3(kmodn)

    и, по порядку, обновить begin[k+p] , зафиксировав его r3, обновить begin[k+q] , зафиксировав его r4, и установить begin[k] в r4.

Throws: Какие и когда RandomAccessIterator операции begin и end бросают.

size_t size() const noexcept;

Returns: Количество 32-битных единиц, которые будут возвращены вызовом param().

Complexity: Постоянное время.

template<class OutputIterator> void param(OutputIterator dest) const;

Requires: OutputIterator должны удовлетворять требованиям output iterator. Более того, выражение *dest = rt должно быть действительным для значения rt типа result_­type.

Effects: Копирует последовательность подготовленных 32-битных модулей в заданное место назначения, как если бы выполняя следующий оператор:

copy(v.begin(), v.end(), dest);

Throws: Какие и когда OutputIterator операции dest броска.

29.6.7.2 Function template generate_­canonical [rand.util.canonical]

Каждая функция экземпляр из шаблона , описанный в этом разделе [rand.util.canonical] отображает результат одного или несколько призываний в комплекте поставку равномерного случайного генератора бит g одного из членов указанной RealType таким образом, что, если значения , gi полученные g равномерно распределены, результаты Инстанцирования в tj, 0tj<1, распределяются как можно более равномерно, как указано ниже.

[ Note: Получение значения таким образом может быть полезным этапом в процессе преобразования значения, сгенерированного генератором однородных случайных битов, в значение, которое может быть доставлено распределением случайных чисел. ]end note

template<class RealType, size_t bits, class URBG> RealType generate_canonical(URBG& g);

Complexity: Точно k=max(1,b/log2R) вызовы g, где b273 - меньшее из numeric_­limits<RealType>​::​digits и bits, а R - значение g.max()g.min()+1.

Effects: Вызывает g() k время для получения значений g0,,gk1соответственно. Рассчитывает количество

S=k1i=0(gig.min())Ri

используя арифметику типа RealType.

Returns: S/Rk.

Throws: Что и когда g кидает.

b вводится, чтобы избежать любых попыток произвести больше битов случайности, чем может быть удержано RealType.

29.6.8 Random number distribution class templates [rand.dist]

29.6.8.1 In general [rand.dist.general]

Каждый тип, созданный из шаблона класса, указанного в этом разделе, [rand.dist] удовлетворяет требованиям random number distribution типа.

Описания представлены в этом разделе [rand.dist] только для операций распространения, которые не описаны, [rand.req.dist] или для операций, для которых имеется дополнительная семантическая информация. В частности, объявления для конструкторов копирования, для операторов присваивания копий, для операторов потоковой передачи и для операторов равенства и неравенства не показаны в резюме.

Алгоритмы создания каждого из указанных распределений определяются реализацией.

Значение каждой функции плотности вероятности p(z) и каждой дискретной функции вероятности, P(zi) указанной в этом разделе, находится 0 везде за пределами указанной области.

29.6.8.2 Uniform distributions [rand.dist.uni]

29.6.8.2.1 Class template uniform_­int_­distribution [rand.dist.uni.int]

uniform_­int_­distribution Случайное распределение числа производит случайные целые числа i, aib, распределенные в соответствии с постоянной дискретной функцией вероятности

P(i|a,b)=1/(ba+1).

template<class IntType = int>
  class uniform_int_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit uniform_int_distribution(IntType a = 0, IntType b = numeric_limits<IntType>::max());
    explicit uniform_int_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    result_type a() const;
    result_type b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit uniform_int_distribution(IntType a = 0, IntType b = numeric_limits<IntType>::max());

Requires: ab.

Effects: Строит uniform_­int_­distribution объект; a и b соответствуют соответствующим параметрам распределения.

result_type a() const;

Returns: Значение a параметра, с которым был построен объект.

result_type b() const;

Returns: Значение b параметра, с которым был построен объект.

29.6.8.2.2 Class template uniform_­real_­distribution [rand.dist.uni.real]

uniform_­real_­distribution Случайное распределение числа производит случайные числа x, ax<b, распределенные в соответствии с функцией плотности вероятности постоянной

p(x|a,b)=1/(ba).

[ Note: Это означает, что p(x|a,b) не определено, когда a == b. ]end note

template<class RealType = double>
  class uniform_real_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
    explicit uniform_real_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    result_type a() const;
    result_type b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);

Requires: ab и banumeric_limits<RealType>::max().

Effects: Строит uniform_­real_­distribution объект; a и b соответствуют соответствующим параметрам распределения.

result_type a() const;

Returns: Значение a параметра, с которым был построен объект.

result_type b() const;

Returns: Значение b параметра, с которым был построен объект.

29.6.8.3 Bernoulli distributions [rand.dist.bern]

29.6.8.3.1 Class bernoulli_­distribution [rand.dist.bern.bernoulli]

bernoulli_­distribution Распределение случайных чисел производит bool значения , b распределенных в соответствии с дискретной вероятностной функцией

P(b|p)={pifb=true1pifb=false.

class bernoulli_distribution {
public:
  // types
  using result_type = bool;
  using param_type  = unspecified;

  // constructors and reset functions
  explicit bernoulli_distribution(double p = 0.5);
  explicit bernoulli_distribution(const param_type& parm);
  void reset();

  // generating functions
  template<class URBG>
    result_type operator()(URBG& g);
  template<class URBG>
    result_type operator()(URBG& g, const param_type& parm);

  // property functions
  double p() const;
  param_type param() const;
  void param(const param_type& parm);
  result_type min() const;
  result_type max() const;
};

explicit bernoulli_distribution(double p = 0.5);

Requires: 0p1.

Effects: Строит bernoulli_­distribution объект; p соответствует параметру распределения.

double p() const;

Returns: Значение p параметра, с которым был построен объект.

29.6.8.3.2 Class template binomial_­distribution [rand.dist.bern.bin]

binomial_­distribution Случайное распределение числа производит целые значения i0 распределены по дискретной функции вероятности

P(i|t,p)=(ti)pi(1p)ti.

template<class IntType = int>
  class binomial_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit binomial_distribution(IntType t = 1, double p = 0.5);
    explicit binomial_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    IntType t() const;
    double p() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit binomial_distribution(IntType t = 1, double p = 0.5);

Requires: 0p1 и 0t.

Effects: Строит binomial_­distribution объект; t и p соответствуют соответствующим параметрам распределения.

IntType t() const;

Returns: Значение t параметра, с которым был построен объект.

double p() const;

Returns: Значение p параметра, с которым был построен объект.

29.6.8.3.3 Class template geometric_­distribution [rand.dist.bern.geo]

geometric_­distribution Случайное распределение числа производит целые значения i0 распределены по дискретной функции вероятности

P(i|p)=p(1p)i.

template<class IntType = int>
  class geometric_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit geometric_distribution(double p = 0.5);
    explicit geometric_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    double p() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit geometric_distribution(double p = 0.5);

Requires: 0<p<1.

Effects: Строит geometric_­distribution объект; p соответствует параметру распределения.

double p() const;

Returns: Значение p параметра, с которым был построен объект.

29.6.8.3.4 Class template negative_­binomial_­distribution [rand.dist.bern.negbin]

negative_­binomial_­distribution Случайное распределение числа производит случайные целые числа , i0 распределенные в соответствии с дискретной вероятностной функцией

P(i|k,p)=(k+i1i)pk(1p)i.

[ Note: Это означает, что P(i|k,p) не определено, когда p == 1. ]end note

template<class IntType = int>
  class negative_binomial_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit negative_binomial_distribution(IntType k = 1, double p = 0.5);
    explicit negative_binomial_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    IntType k() const;
    double p() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit negative_binomial_distribution(IntType k = 1, double p = 0.5);

Requires: 0<p1 и 0<k.

Effects: Строит negative_­binomial_­distribution объект; k и p соответствуют соответствующим параметрам распределения.

IntType k() const;

Returns: Значение k параметра, с которым был построен объект.

double p() const;

Returns: Значение p параметра, с которым был построен объект.

29.6.8.4 Poisson distributions [rand.dist.pois]

29.6.8.4.1 Class template poisson_­distribution [rand.dist.pois.poisson]

poisson_­distribution Случайное распределение числа производит целые значения i0 распределены по дискретной функции вероятности

P(i|μ)=eμμii!.

Параметр распределения μ также известен как это распределение . mean

template<class IntType = int>
  class poisson_distribution
  {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit poisson_distribution(double mean = 1.0);
    explicit poisson_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    double mean() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit poisson_distribution(double mean = 1.0);

Requires: 0<mean.

Effects: Строит poisson_­distribution объект; mean соответствует параметру распределения.

double mean() const;

Returns: Значение mean параметра, с которым был построен объект.

29.6.8.4.2 Class template exponential_­distribution [rand.dist.pois.exp]

exponential_­distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности

p(x|λ)=λeλx.

template<class RealType = double>
  class exponential_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit exponential_distribution(RealType lambda = 1.0);
    explicit exponential_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType lambda() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit exponential_distribution(RealType lambda = 1.0);

Requires: 0<lambda.

Effects: Создает exponential_­distribution объект; lambda соответствует параметру распределения.

RealType lambda() const;

Returns: Значение lambda параметра, с которым был построен объект.

29.6.8.4.3 Class template gamma_­distribution [rand.dist.pois.gamma]

gamma_­distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности

p(x|α,β)=ex/ββαΓ(α)xα1.

template<class RealType = double>
  class gamma_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit gamma_distribution(RealType alpha = 1.0, RealType beta = 1.0);
    explicit gamma_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType alpha() const;
    RealType beta() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit gamma_distribution(RealType alpha = 1.0, RealType beta = 1.0);

Requires: 0<alpha и 0<beta.

Effects: Строит gamma_­distribution объект; alpha и beta соответствуют параметрам распределения.

RealType alpha() const;

Returns: Значение alpha параметра, с которым был построен объект.

RealType beta() const;

Returns: Значение beta параметра, с которым был построен объект.

29.6.8.4.4 Class template weibull_­distribution [rand.dist.pois.weibull]

weibull_­distribution Случайное распределение числа производит случайные числа , x0 распределенные в соответствии с функцией плотности вероятности

p(x|a,b)=ab(xb)a1exp((xb)a).

template<class RealType = double>
  class weibull_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit weibull_distribution(RealType a = 1.0, RealType b = 1.0);
    explicit weibull_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType a() const;
    RealType b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit weibull_distribution(RealType a = 1.0, RealType b = 1.0);

Requires: 0<a и 0<b.

Effects: Строит weibull_­distribution объект; a и b соответствуют соответствующим параметрам распределения.

RealType a() const;

Returns: Значение a параметра, с которым был построен объект.

RealType b() const;

Returns: Значение b параметра, с которым был построен объект.

29.6.8.4.5 Class template extreme_­value_­distribution [rand.dist.pois.extreme]

extreme_­value_­distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности274

p(x|a,b)=1bexp(axbexp(axb)).

template<class RealType = double>
  class extreme_value_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit extreme_value_distribution(RealType a = 0.0, RealType b = 1.0);
    explicit extreme_value_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType a() const;
    RealType b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit extreme_value_distribution(RealType a = 0.0, RealType b = 1.0);

Requires: 0<b.

Effects: Создает extreme_­value_­distribution объект; a и b соответствуют соответствующим параметрам распределения.

RealType a() const;

Returns: Значение a параметра, с которым был построен объект.

RealType b() const;

Returns: Значение b параметра, с которым был построен объект.

Распределение, соответствующее этой функции плотности вероятности, также известно (с возможным изменением переменной) как распределение Гамбеля типа I, лог-Вейбулла или распределение Фишера-Типпетта типа I.

29.6.8.5 Normal distributions [rand.dist.norm]

29.6.8.5.1 Class template normal_­distribution [rand.dist.norm.normal]

normal_­distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности

p(x|μ,σ)=1σ2πexp((xμ)22σ2).

Параметры распределения μ и σ также известны как этого распределения и . mean standard deviation

template<class RealType = double>
  class normal_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
    explicit normal_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType mean() const;
    RealType stddev() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);

Requires: 0<stddev.

Effects: Строит normal_­distribution объект; mean и stddev соответствуют соответствующим параметрам распределения.

RealType mean() const;

Returns: Значение mean параметра, с которым был построен объект.

RealType stddev() const;

Returns: Значение stddev параметра, с которым был построен объект.

29.6.8.5.2 Class template lognormal_­distribution [rand.dist.norm.lognormal]

lognormal_­distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности

p(x|m,s)=1sx2πexp((lnxm)22s2).

template<class RealType = double>
  class lognormal_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit lognormal_distribution(RealType m = 0.0, RealType s = 1.0);
    explicit lognormal_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType m() const;
    RealType s() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit lognormal_distribution(RealType m = 0.0, RealType s = 1.0);

Requires: 0<s.

Effects: Строит lognormal_­distribution объект; m и s соответствуют соответствующим параметрам распределения.

RealType m() const;

Returns: Значение m параметра, с которым был построен объект.

RealType s() const;

Returns: Значение s параметра, с которым был построен объект.

29.6.8.5.3 Class template chi_­squared_­distribution [rand.dist.norm.chisq]

chi_­squared_­distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности

p(x|n)=x(n/2)1ex/2Γ(n/2)2n/2.

template<class RealType = double>
  class chi_squared_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit chi_squared_distribution(RealType n = 1);
    explicit chi_squared_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType n() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit chi_squared_distribution(RealType n = 1);

Requires: 0<n.

Effects: Строит chi_­squared_­distribution объект; n соответствует параметру распределения.

RealType n() const;

Returns: Значение n параметра, с которым был построен объект.

29.6.8.5.4 Class template cauchy_­distribution [rand.dist.norm.cauchy]

cauchy_­distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности

p(x|a,b)=(πb(1+(xab)2))1.

template<class RealType = double>
  class cauchy_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit cauchy_distribution(RealType a = 0.0, RealType b = 1.0);
    explicit cauchy_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType a() const;
    RealType b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit cauchy_distribution(RealType a = 0.0, RealType b = 1.0);

Requires: 0<b.

Effects: Строит cauchy_­distribution объект; a и b соответствуют соответствующим параметрам распределения.

RealType a() const;

Returns: Значение a параметра, с которым был построен объект.

RealType b() const;

Returns: Значение b параметра, с которым был построен объект.

29.6.8.5.5 Class template fisher_­f_­distribution [rand.dist.norm.f]

fisher_­f_­distribution Случайное распределение числа производит случайные числа , x≥0 распределенные в соответствии с функцией плотности вероятности

p(x|m,n)=Γ((m+n)/2)Γ(m/2)Γ(n/2)(mn)m/2x(m/2)1(1+mxn)(m+n)/2.

template<class RealType = double>
  class fisher_f_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit fisher_f_distribution(RealType m = 1, RealType n = 1);
    explicit fisher_f_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType m() const;
    RealType n() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit fisher_f_distribution(RealType m = 1, RealType n = 1);

Requires: 0<m и 0<n.

Effects: Строит fisher_­f_­distribution объект; m и n соответствуют соответствующим параметрам распределения.

RealType m() const;

Returns: Значение m параметра, с которым был построен объект.

RealType n() const;

Returns: Значение n параметра, с которым был построен объект.

29.6.8.5.6 Class template student_­t_­distribution [rand.dist.norm.t]

student_­t_­distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности

p(x|n)=1nπΓ((n+1)/2)Γ(n/2)(1+x2n)(n+1)/2.

template<class RealType = double>
  class student_t_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit student_t_distribution(RealType n = 1);
    explicit student_t_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType n() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit student_t_distribution(RealType n = 1);

Requires: 0<n.

Effects: Строит student_­t_­distribution объект; n соответствует параметру распределения.

RealType n() const;

Returns: Значение n параметра, с которым был построен объект.

29.6.8.6 Sampling distributions [rand.dist.samp]

29.6.8.6.1 Class template discrete_­distribution [rand.dist.samp.discrete]

discrete_­distribution Случайное распределение числа производит случайные целые числа i, 0i<n, распределенных в соответствии с дискретной вероятностной функции

P(i|p0,,pn1)=pi.

Если не указано иное, параметры распределения рассчитываются как:, pk=wk/S for k=0,,n1 в котором значения wk, обычно известные как , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, соотношение должно занимать: . weights 0<S=w0++wn1

template<class IntType = int>
  class discrete_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructor and reset functions
    discrete_distribution();
    template<class InputIterator>
      discrete_distribution(InputIterator firstW, InputIterator lastW);
    discrete_distribution(initializer_list<double> wl);
    template<class UnaryOperation>
      discrete_distribution(size_t nw, double xmin, double xmax, UnaryOperation fw);
    explicit discrete_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    vector<double> probabilities() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

discrete_distribution();

Effects: Создает discrete_­distribution объект с помощью n=1 и p0=1. [ Note: Такой объект всегда будет иметь ценность 0. ] end note

template<class InputIterator> discrete_distribution(InputIterator firstW, InputIterator lastW);

Requires: InputIterator должны удовлетворять требованиям input iterator. Кроме того, iterator_­traits<InputIterator>​::​value_­type будет обозначать тип, в который можно преобразовать double. Если firstW == lastW, пусть n=1 и w0=1. В противном случае [firstW,lastW) формируется последовательность w длины n>0.

Effects: Создает discrete_­distribution объект с вероятностями, заданными формулой выше.

discrete_distribution(initializer_list<double> wl);

Effects: То же, что и discrete_­distribution(wl.begin(), wl.end()).

template<class UnaryOperation> discrete_distribution(size_t nw, double xmin, double xmax, UnaryOperation fw);

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра. Если nw=0, пусть n=1, иначе пусть n=nw. Отношение 0<δ=(xmaxxmin)/n должно сохраняться.

Effects: Создает discrete_­distribution объект с вероятностями, заданными формулой выше, используя следующие значения: Если nw=0, пусть w0=1. В противном случае пусть wk=fw(xmin+kδ+δ/2) для k=0,,n1.

Complexity: Количество обращений fw не должно превышать n.

vector<double> probabilities() const;

Returns: Объект vector<double> , size член которого возвращается n и operator[] член которого возвращается pk при вызове с аргументом k for k=0,,n1.

29.6.8.6.2 Class template piecewise_­constant_­distribution [rand.dist.samp.pconst]

piecewise_­constant_­distribution Случайное распределение числа производит случайные числа x, b0x<bnравномерно распределяется по каждому подинтервалу в [bi,bi+1) соответствии с функцией плотности вероятности

p(x|b0,,bn,ρ0,,ρn1)=ρi, for bix<bi+1.

Параметры n+1 распределения bi, также известные как это распределение , должны удовлетворять соотношению для . Если не указано иное, остальные параметры распределения рассчитываются как: interval boundaries bi<bi+1 i=0,,n1 n

ρk=wkS(bk+1bk) for k=0,,n1,

в котором значения wk, обычно известные как the , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, соотношение должно занимать: . weights 0<S=w0++wn1

template<class RealType = double>
  class piecewise_constant_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    piecewise_constant_distribution();
    template<class InputIteratorB, class InputIteratorW>
      piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB,
                                      InputIteratorW firstW);
    template<class UnaryOperation>
      piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);
    template<class UnaryOperation>
      piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax,
                                      UnaryOperation fw);
    explicit piecewise_constant_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    vector<result_type> intervals() const;
    vector<result_type> densities() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

piecewise_constant_distribution();

Effects: Создает piecewise_­constant_­distribution объект с n=1, ρ0=1, b0=0и b1=1.

template<class InputIteratorB, class InputIteratorW> piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB, InputIteratorW firstW);

Requires: InputIteratorB и InputIteratorW каждый должен удовлетворять требованиям своего input iterator типа. Кроме того, каждый iterator_­traits<InputIteratorB>​::​value_­type и iterator_­traits<InputIteratorW>​::​value_­typeдолжен обозначать тип, в который можно преобразовать double. Если firstB == lastB или ++firstB == lastB, пусть n=1, w0=1, b0=0и b1=1. В противном случае [firstB,lastB) должен формировать последовательность b длины n+1, длина последовательности, w начиная с, firstW должна быть не менее n, и любое значение wk for kn должно игнорироваться распределением.

Effects: Создает piecewise_­constant_­distribution объект с параметрами, указанными выше.

template<class UnaryOperation> piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра.

Effects: Создает piecewise_­constant_­distribution объект с параметрами , принятых или вычисленных из следующих значений: Если bl.size()<2, пусть n=1, w0=1, b0=0и b1=1. В противном случае позвольте [bl.begin(),bl.end()) сформировать последовательность b0,,bnи позвольте wk=fw((bk+1+bk)/2) для k=0,,n1.

Complexity: Количество обращений fw не должно превышать n.

template<class UnaryOperation> piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра. Если nw=0, пусть n=1, иначе пусть n=nw. Отношение 0<δ=(xmaxxmin)/n должно сохраняться.

Effects: Создает piecewise_­constant_­distribution объект с параметрами, взятыми или вычисленными из следующих значений: Let bk=xmin+kδ for k=0,,nи wk=fw(bk+δ/2) for k=0,,n1.

Complexity: Количество обращений fw не должно превышать n.

vector<result_type> intervals() const;

Returns: Объект vector<result_­type> , size член которого возвращается n+1 и operator[] член которого возвращается bk при вызове с аргументом k for k=0,,n.

vector<result_type> densities() const;

Returns: Объект vector<result_­type> , size член которого возвращается n и operator[] член которого возвращается ρk при вызове с аргументом k for k=0,,n1.

29.6.8.6.3 Class template piecewise_­linear_­distribution [rand.dist.samp.plinear]

piecewise_­linear_­distribution Случайное распределение числа производит случайные числа x, b0x<bn, распределяется по каждому подинтервалу в [bi,bi+1) соответствии с функцией плотности вероятности

p(x|b0,,bn,ρ0,,ρn)=ρibi+1xbi+1bi+ρi+1xbibi+1bi, for bix<bi+1.

Параметры n+1 распределения bi, также известные как это распределение , должны удовлетворять соотношению для . Если не указано иное, остальные параметры распределения вычисляются как , в котором значения , обычно известные как , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, должно выполняться следующее соотношение: interval boundaries bi<bi+1 i=0,,n1 n+1 ρk=wk/S for k=0,,n wk weights at boundaries

0<S=12n1k=0(wk+wk+1)(bk+1bk).

template<class RealType = double>
  class piecewise_linear_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    piecewise_linear_distribution();
    template<class InputIteratorB, class InputIteratorW>
      piecewise_linear_distribution(InputIteratorB firstB, InputIteratorB lastB,
                                    InputIteratorW firstW);
    template<class UnaryOperation>
      piecewise_linear_distribution(initializer_list<RealType> bl, UnaryOperation fw);
    template<class UnaryOperation>
      piecewise_linear_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);
    explicit piecewise_linear_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    vector<result_type> intervals() const;
    vector<result_type> densities() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

piecewise_linear_distribution();

Effects: Создает piecewise_­linear_­distribution объект с n=1, ρ0=ρ1=1, b0=0и b1=1.

template<class InputIteratorB, class InputIteratorW> piecewise_linear_distribution(InputIteratorB firstB, InputIteratorB lastB, InputIteratorW firstW);

Requires: InputIteratorB и InputIteratorW каждый должен удовлетворять требованиям своего input iterator типа. Кроме того, каждый iterator_­traits<InputIteratorB>​::​value_­type и iterator_­traits<InputIteratorW>​::​value_­typeдолжен обозначать тип, в который можно преобразовать double. Если firstB == lastB или ++firstB == lastB, пусть n=1, ρ0=ρ1=1, b0=0и b1=1. В противном случае [firstB,lastB) должен формировать последовательность b длины n+1, длина последовательности, w начиная с, firstW должна быть не менее n+1, и любое значение wk for kn+1 должно игнорироваться распределением.

Effects: Создает piecewise_­linear_­distribution объект с параметрами, указанными выше.

template<class UnaryOperation> piecewise_linear_distribution(initializer_list<RealType> bl, UnaryOperation fw);

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра.

Effects: Создает piecewise_­linear_­distribution объект с параметрами , принятых или вычисленных из следующих значений: Если bl.size()<2, пусть n=1, ρ0=ρ1=1, b0=0и b1=1. В противном случае позвольте [bl.begin(),bl.end()) сформировать последовательность b0,,bnи позвольте wk=fw(bk) для k=0,,n.

Complexity: Количество обращений fw не должно превышать n+1.

template<class UnaryOperation> piecewise_linear_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра. Если nw=0, пусть n=1, иначе пусть n=nw. Отношение 0<δ=(xmaxxmin)/n должно сохраняться.

Effects: Создает piecewise_­linear_­distribution объект с параметрами, взятыми или вычисленными из следующих значений: Let bk=xmin+kδ for k=0,,nи wk=fw(bk) for k=0,,n.

Complexity: Количество обращений fw не должно превышать n+1.

vector<result_type> intervals() const;

Returns: Объект vector<result_­type> , size член которого возвращается n+1 и operator[] член которого возвращается bk при вызове с аргументом k for k=0,,n.

vector<result_type> densities() const;

Returns: Объект vector<result_­type> , size член которого возвращается n и operator[] член которого возвращается ρk при вызове с аргументом k for k=0,,n.

29.6.9 Low-quality random number generation [c.math.rand]

[ Note: Заголовок <cstdlib> объявляет функции, описанные в этом подпункте. ]end note

int rand(); void srand(unsigned int seed);

Effects: rand И srand функции имеют семантику , указанную в стандартной библиотеке C.

Remarks: Реализация может указывать, что могут вызывать определенные библиотечные функции rand. Это определяется реализацией, rand может ли функция вводить данные races ( [res.on.data.races]). [ Другие средства генерации случайных чисел в этом международном стандарте ( ) часто предпочтительнее , потому что лежащий в основе алгоритм не определен. Поэтому использование по- прежнему непереносимо, с непредсказуемым и часто сомнительным качеством и производительностью. ] Note: [rand] rand rand rand end note

См. Также: ISO C 7.22.2