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