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();
template<class T>
seed_seq(initializer_list<T> il);
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=end−beginзаполняет предоставленный диапазон в [begin,end) соответствии со следующим алгоритмом, в котором каждая операция должна выполняться по модулю 232, каждый примененный оператор индексации begin должен приниматься по модулю nи T(x) определяется как xxor(xrshift27):
a)В качестве инициализации установите значение каждого элемента диапазона 0x8b8b8b8b. Кроме того, для использования на последующих этапах, пусть p=(n−t)/2 и пусть q=p+t, где
t=(n≥623) ? 11 : (n≥68) ? 7 : (n≥39) ? 5 : (n≥7) ? 3 : (n−1)/2;
b)С m как большее из s+1 и nпреобразовать элементы диапазона: итеративно для k=0,…,m−1, вычислить значения
r1=1664525⋅T(begin[k]xorbegin[k+p]xorbegin[k−1])r2=r1+⎧⎪⎨⎪⎩s, k=0kmodn+v[k−1], 0<k≤skmodn, s<k
и, по порядку, увеличить begin[k+p] на r1, увеличить begin[k+q] на r2и установить begin[k] в r2.
c)Снова преобразовать элементы диапазона, начиная с того места, где закончился предыдущий шаг: итеративно для k=m,…,m+n−1, вычислить значения
r3=1566083941⋅T(begin[k]+begin[k+p]+begin[k−1])r4=r3−(kmodn)
и, по порядку, обновить begin[k+p] , зафиксировав его r3, обновить begin[k+q] , зафиксировав его r4, и установить begin[k] в r4.
size_t size() const noexcept;
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);
Каждая функция экземпляр из шаблона , описанный в этом разделе [rand.util.canonical] отображает результат одного или несколько призываний в комплекте поставку равномерного случайного генератора бит g одного из членов указанной RealType таким образом, что, если значения , gi полученные g равномерно распределены, результаты Инстанцирования в tj, 0≤tj<1, распределяются как можно более равномерно, как указано ниже.
[ Note: Получение значения таким образом может быть полезным этапом в процессе преобразования значения, сгенерированного генератором однородных случайных битов, в значение, которое может быть доставлено распределением случайных чисел. ] — end note
template<class RealType, size_t bits, class URBG>
RealType generate_canonical(URBG& g);
Effects: Вызывает g() k время для получения значений g0,…,gk−1соответственно. Рассчитывает количество
S=k−1∑i=0(gi−g.min())⋅Ri
используя арифметику типа RealType.
b вводится, чтобы избежать любых попыток произвести больше битов случайности, чем может быть удержано RealType.