29 Numerics library [numerics]

29.6 Random number generation [rand]

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

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

shuffle_­order_­engine Случайным образом номер адаптера двигатель производит те же самые случайные числа, которые производятся некоторым базовым двигателем e, но доставляет их в другой последовательности. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя , дополнительное значение типа поставляемого и дополнительная последовательность из значений и типа поставляемого . Размер государства равен размеру государства плюс . xi shuffle_­order_­engine x ei e Y e V k e e k+1

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

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

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

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

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.

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

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