29 Numerics library [numerics]

29.6 Random number generation [rand]

29.6.3 Random number engine class templates [rand.eng]

29.6.3.3 Class template subtract_­with_­carry_­engine [rand.eng.sub]

Механизмsubtract_­with_­carry_­engine случайных чисел производит беззнаковые целые случайные числа.

Состояние из объекта имеет размера , и состоит из последовательности из целочисленных значений ; все применяемые индексы следует брать по модулю . Состояние дополнительно состоит из целого числа (известного как ) , значение которого равно или . xisubtract_­with_­carry_­engine xO(r)X r 0Xi<m=2wX rxiccarry0 1

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

  1. a)ПустьY=XisXirc.

  2. b)УстановитеXi наy=Ymodm. Установитеc в 1, еслиY<0, в противном случае установитеc в 0.

[ Note: Этот алгоритм соответствует модульной линейной функции вида TA(xi)=(axi)modb, гдеb имеет вид mrms+1 иa=b(b1)/m. ]end note

Алгоритм генерации задается формулой , где - значение, полученное в результате улучшения состояния двигателя, как описано выше.GA(xi)=yy

template<class UIntType, size_t w, size_t s, size_t r>
  class subtract_with_carry_engine {
  public:
    // types
    using result_type = UIntType;

    // engine characteristics
    static constexpr size_t word_size = w;
    static constexpr size_t short_lag = s;
    static constexpr size_t long_lag = r;
    static constexpr result_type min() { return 0; }
    static constexpr result_type max() { return m1; }
    static constexpr result_type default_seed = 19780503u;

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

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

Следующие соотношения должны проводить: 0u < s, s < r, 0 < w, и w <= numeric_­limits<UIntType>​::​digits.

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

explicit subtract_with_carry_engine(result_type value = default_seed);

Effects: Создаетsubtract_­with_­carry_­engine объект. Устанавливает значения Xr,,X1в указанном ниже порядке в указанном ниже порядке. ЕслиX1 есть, то0устанавливаетсяc в1; в противном случае устанавливаетсяc на0.

Для того, чтобы установить значениеXk, первые построитьe, Аlinear_­congruential_­engine объект, как если бы по следующему определению:

linear_congruential_engine<result_type,
                          40014u,0u,2147483563u> e(value == 0u ? default_seed : value);

Затем, чтобы установить каждыйXk, получить новые значенияz0,,zn1 изn=w/32 последовательных вызововe взятого по модулю232. УстановитеXk на(n1j=0zj232j)modm.

Complexity: Собственноnr заклинанияe.

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

Effects: Создаетsubtract_­with_­carry_­engine объект. With k=w/32 иa массив (или эквивалент) длиныrkвызывает,q.generate(a+0, a+rk) а затем, итеративно дляi=r,,1, устанавливаетXi значение(k1j=0ak(i+r)+j232j)modm. ЕслиX1 есть, то0устанавливаетсяc в1; в противном случае устанавливаетсяc на0.