29 Numerics library [numerics]

29.6 Random number generation [rand]

29.6.3 Random number engine class templates [rand.eng]

29.6.3.1 Class template linear_­congruential_­engine [rand.eng.lcong]

Механизмlinear_­congruential_­engine случайных чисел производит беззнаковые целые случайные числа. Состояние из объекта имеет размер и состоит из одного целого числа. Алгоритм перехода представляет собой модульную линейную функцию формы ; алгоритм генерации есть . xilinear_­congruential_­engine x1TA(xi)=(axi+c)modmGA(xi)=xi+1

template<class UIntType, UIntType a, UIntType c, UIntType m>
  class linear_congruential_engine {
  public:
    // types
    using result_type = UIntType;

    // engine characteristics
    static constexpr result_type multiplier = a;
    static constexpr result_type increment = c;
    static constexpr result_type modulus = m;
    static constexpr result_type min() { return c == 0u ? 1u: 0u; }
    static constexpr result_type max() { return m - 1u; }
    static constexpr result_type default_seed = 1u;

    // constructors and seeding functions
    explicit linear_congruential_engine(result_type s = default_seed);
    template<class Sseq> explicit linear_congruential_engine(Sseq& q);
    void seed(result_type s = default_seed);
    template<class Sseq> void seed(Sseq& q);

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

Если параметр шаблона m равен0, модуль,m используемый в этом разделе, равен плюсу . [ не обязательно представлять как значение типа . ][rand.eng.lcong] numeric_­limits<result_­type>​::​max() 1Note: m result_­typeend note

Если параметр шаблона m не равен0, должны выполняться следующие отношения: a < m и c < m.

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

explicit linear_congruential_engine(result_type s = default_seed);

Effects: Создаетlinear_­congruential_­engine объект. Еслиcmodm есть0 иsmodm есть0, устанавливает состояние двигателя в1, в противном случае устанавливает состояние двигателя вsmodm.

template<class Sseq> explicit linear_congruential_engine(Sseq& q);

Effects: Создаетlinear_­congruential_­engine объект. С k=log2m32 иa массивом (или эквивалентом) длиныk+3вызывает,q.generate(a+0, a+k+3) а затем вычисляет S=(k1j=0aj+3232j)modm. Если cmodm есть0 и S есть0, устанавливает состояние двигателя в1, иначе устанавливает состояние двигателя вS.