29 Numerics library [numerics]

29.6 Random number generation [rand]

29.6.1 Requirements [rand.req]

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, удовлетворяющим требованиям aseed 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 ifSx=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) (которые могут вызывать throwios​::​failure ([iostate.flags])). Если текстовое представление, записанное через,os << x было впоследствии прочитано черезis >> v, тоx == v при условии, что не было промежуточных вызовов ofx или ofv. Requires: is предоставляет текстовое представление, которое ранее было написано с использованием выходного потока, встроенная локаль которого была такой же, как и уis, и аргументы специализации шаблона charT и для которогоtraits были, соответственно, такими же, как уis. Неизменны. Postconditions: is.fmtflags O(size of state)

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

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

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