29 Numerics library [numerics]

29.6 Random number generation [rand]

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 броска.