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

29.6.7.2 Function template generate_­canonical [rand.util.canonical]

Каждая функция экземпляр из шаблона , описанный в этом разделе [rand.util.canonical] отображает результат одного или несколько призываний в комплекте поставку равномерного случайного генератора бит g одного из членов указанной RealType таким образом, что, если значения , gi полученные g равномерно распределены, результаты Инстанцирования в tj, 0tj<1, распределяются как можно более равномерно, как указано ниже.

[ Note: Получение значения таким образом может быть полезным этапом в процессе преобразования значения, сгенерированного генератором однородных случайных битов, в значение, которое может быть доставлено распределением случайных чисел. ]end note

template<class RealType, size_t bits, class URBG> RealType generate_canonical(URBG& g);

Complexity: Точно k=max(1,b/log2R) вызовы g, где b273 - меньшее из numeric_­limits<RealType>​::​digits и bits, а R - значение g.max()g.min()+1.

Effects: Вызывает g() k время для получения значений g0,,gk1соответственно. Рассчитывает количество

S=k1i=0(gig.min())Ri

используя арифметику типа RealType.

Returns: S/Rk.

Throws: Что и когда g кидает.

b вводится, чтобы избежать любых попыток произвести больше битов случайности, чем может быть удержано RealType.