29 Numerics library [numerics]

29.6 Random number generation [rand]

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;