29 Numerics library [numerics]

29.6 Random number generation [rand]

29.6.4 Random number engine adaptor class templates [rand.adapt]

29.6.4.1 In general [rand.adapt.general]

Каждый тип, созданный из шаблона класса, указанного в этом разделе,[rand.adapt] удовлетворяет требованиямrandom number engine adaptor типа.

Если не указано иное, сложность каждой функции, указанной в этом разделе,[rand.adapt] является постоянной.

Если не указано иное, ни одна функция, описанная в этом разделе, не[rand.adapt] вызывает исключение.

Каждая функция, описанная в этом разделе,[rand.adapt] которая имеет параметр функцииq типаSseq& для параметра типа шаблона с именемSseq , отличным от типа,seed_­seq вызывает то, что и когдаq.generate вызывает вызов throw.

Описание предоставляется в этом разделе[rand.adapt] только для операций адаптера, которые не описаны в разделе,[rand.req.adapt] или для операций, для которых существует дополнительная семантическая информация. В частности, объявления для конструкторов копирования, для операторов присваивания копий, для операторов потоковой передачи и для операторов равенства и неравенства не показаны в резюме.

Каждый шаблон, указанный в этом разделе,[rand.adapt] требует удержания одного или нескольких отношений, включающих значение (значения) не относящихся к типу параметров шаблона. Программа, реализующая любой из этих шаблонов, плохо сформирована, если какая-либо такая требуемая взаимосвязь не выполняется.

29.6.4.2 Class template discard_­block_­engine [rand.adapt.disc]

discard_­block_­engine Случайным образом номера адаптер двигателя производит случайные числа , выбранные из производства некоторых базового двигателяe. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя и дополнительного целого числа . Размер государства равен размеру государства плюс . xidiscard_­block_­engine xei ene1

Алгоритм перехода отбрасывает все значения, кроме значений, из каждого блока значений, предоставленного . Переход между состояниями выполняется следующим образом: Если , переместите состояние из в и установите в . В любом случае, затем увеличивайте и продвигайте текущее состояние до .r>0 pr enre ei ei+prn 0neejej+1

Алгоритм генерации выдает значение, возвращенное последним вызовом состояния при продвижении , как описано выше.e()e

template<class Engine, size_t p, size_t r>
  class discard_block_engine {
  public:
    // types
    using result_type = typename Engine::result_type;

    // engine characteristics
    static constexpr size_t block_size = p;
    static constexpr size_t used_block = r;
    static constexpr result_type min() { return Engine::min(); }
    static constexpr result_type max() { return Engine::max(); }

    // constructors and seeding functions
    discard_block_engine();
    explicit discard_block_engine(const Engine& e);
    explicit discard_block_engine(Engine&& e);
    explicit discard_block_engine(result_type s);
    template<class Sseq> explicit discard_block_engine(Sseq& q);
    void seed();
    void seed(result_type s);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);

    // property functions
    const Engine& base() const noexcept { return e; };

  private:
    Engine e;   // exposition only
    int n;      // exposition only
  };

Имеют место следующие отношения: 0 < r и r <= p.

Текстовое представление состоит из текстового представления, за которым следует значение .en

В дополнение к своему поведению в соответствии с разделом[rand.req.adapt]каждый конструктор, который не является конструктором копирования, устанавливаетn значение0.

29.6.4.3 Class template independent_­bits_­engine [rand.adapt.ibits]

Anindependent_­bits_­engine адаптер сочетает в себе случайное число случайных чисел двигателей, которые производятся некоторым базовым двигателемe, таким образом , чтобы произвести случайные числа с заданным количеством битовw. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя ; размер государства - это размер российского государства. xiindependent_­bits_­enginexei ee

Алгоритмы перехода и генерации описываются следующими интегральными константами:

  1. a)Пусть R=e.max() - e.min() + 1 и m=log2R.

  2. b)С ,n как определено ниже, пусть w0=w/n, n0=nwmodn, y0=2w0R/2w0и y1=2w0+1R/2w0+1.

  3. c)Пусть n=w/m тогда и только тогда, когда в результате соотношение Ry0y0/n выполняется. Иначе пусть n=1+w/m.

[ Note: Отношение w=n0w0+(nn0)(w0+1) всегда сохраняется. ]end note

Алгоритм перехода выполняется путем вызова по мере необходимости для получения значений меньше чем и значений меньше чем .e()n0y0+e.min()nn0y1+e.min()

Алгоритм генерации использует значения, полученные при продвижении состояния, как описано выше, чтобы получить количество, полученное, как если бы по следующему алгоритму: S

S = 0;
for (k = 0; kn0; k += 1)  {
 do u = e() - e.min(); while (uy0);
 S = 2w0S+umod2w0;
}
for (k = n0; kn; k += 1)  {
 do u = e() - e.min(); while (uy1);
 S = 2w0+1S+umod2w0+1;
}

template<class Engine, size_t w, class UIntType>
  class independent_bits_engine {
  public:
    // types
    using result_type = UIntType;

    // engine characteristics
    static constexpr result_type min() { return 0; }
    static constexpr result_type max() { return 2w1; }

    // constructors and seeding functions
    independent_bits_engine();
    explicit independent_bits_engine(const Engine& e);
    explicit independent_bits_engine(Engine&& e);
    explicit independent_bits_engine(result_type s);
    template<class Sseq> explicit independent_bits_engine(Sseq& q);
    void seed();
    void seed(result_type s);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);

    // property functions
    const Engine& base() const noexcept { return e; };

  private:
    Engine e;   // exposition only
  };

Имеют место следующие отношения: 0 < w и w <= numeric_­limits<result_­type>​::​digits.

Текстовое представление состоит из текстового представления .e

29.6.4.4 Class template shuffle_­order_­engine [rand.adapt.shuf]

shuffle_­order_­engine Случайным образом номер адаптера двигатель производит те же самые случайные числа, которые производятся некоторым базовым двигателемe, но доставляет их в другой последовательности. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя , дополнительное значение типа поставляемого и дополнительная последовательность из значений и типа поставляемого . Размер государства равен размеру государства плюс . xishuffle_­order_­engine xei eY eV k eek+1

Алгоритм перехода переставляет значения, создаваемые . Переход между состояниями выполняется следующим образом: e

  1. a)Вычислить целое число j=k(Yemin)emaxemin+1 .

  2. b)НаборY дляVj и затем установитьVj вe().

Алгоритм генерации выдает последнее значение, полученное при продвижении , как описано выше.Ye

template<class Engine, size_t k>
  class shuffle_order_engine {
  public:
    // types
    using result_type = typename Engine::result_type;

    // engine characteristics
    static constexpr size_t table_size = k;
    static constexpr result_type min() { return Engine::min(); }
    static constexpr result_type max() { return Engine::max(); }

    // constructors and seeding functions
    shuffle_order_engine();
    explicit shuffle_order_engine(const Engine& e);
    explicit shuffle_order_engine(Engine&& e);
    explicit shuffle_order_engine(result_type s);
    template<class Sseq> explicit shuffle_order_engine(Sseq& q);
    void seed();
    void seed(result_type s);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);

    // property functions
    const Engine& base() const noexcept { return e; };

  private:
    Engine e;           // exposition only
    result_type V[k];   // exposition only
    result_type Y;      // exposition only
  };

Следующее соотношение должно занимать: 0 < k.

Текстовое представление состоит из текстового представления , за которым следуют значения , за которыми следует значение .ek VY

В дополнение к своему поведению в соответствии с разделом[rand.req.adapt], каждый конструктор, который не является конструктором копирования, инициализируетсяV[0],,V[k-1] иYв этом порядке значениями, возвращаемыми последовательными вызовамиe().