Namespaces
Variants

std::mersenne_twister_engine<UIntType,w,n,m,r,a,u,d,s,b,t,c,l,f>:: mersenne_twister_engine

From cppreference.net
mersenne_twister_engine ( ) : mersenne_twister_engine ( default_seed ) { }
(1) (начиная с C++11)
explicit mersenne_twister_engine ( result_type value ) ;
(2) (начиная с C++11)
template < class SeedSeq >
explicit mersenne_twister_engine ( SeedSeq & seq ) ;
(3) (начиная с C++11)
mersenne_twister_engine ( const mersenne_twister_engine & other ) ;
(4) (начиная с C++11)
(неявно объявлен)

Создает генератор псевдослучайных чисел.

1) Конструктор по умолчанию.
  • Если конструктор по умолчанию создает движок типа std::mt19937 , то 10000-е последовательное его использование производит значение 4123659995 .
  • Если конструктор по умолчанию создает движок типа std::mt19937_64 , то 10000-е последовательное его использование производит значение 9981545732273789042 .
2) Конструирует генератор со значением зерна value . При заданном 2 w
как p , начальное состояние генератора определяется следующим образом:
  1. Устанавливает X -n в value % p .
  2. Для каждого целого числа i в [ i - n , - 1 ] , устанавливает X i в [f·(X i-1 xor (X i-1 rshift (w-2)))+i mod n] mod p , где xor и rshift обозначают встроенные операции побитового XOR и побитового сдвига вправо соответственно.
3) Конструирует генератор с последовательностью инициализации seq . При заданном std:: size_t ( w / 32 ) + 1 как k , начальное состояние генератора определяется следующим образом:
  1. Создаётся временный массив a длиной n * k .
  2. Вызывается seq. generate ( a + 0 , a + n * k ) .
  3. Для каждого целого числа i в [ - n , - 1 ] устанавливается X i равным (∑ k-1
    j=0
    a k(i+n)+j ·2 32j
    ) mod 2 w
    .
  4. Если старшие w − r битов X -n равны нулю, и если все остальные полученные X i равны 0 , то значение X -n изменяется на 2 w-1
    .
Эта перегрузка участвует в разрешении перегрузки только если SeedSeq удовлетворяет требованиям SeedSequence .
4) Конструктор копирования. При создании * this == other выполняется условие true .

Содержание

Параметры

value - начальное значение для инициализации внутреннего состояния
seq - последовательность начальных значений для инициализации внутреннего состояния

Сложность

1,2) O(n) .
3) Такая же, как сложность вызова seq.generate .
4) O(n) .

Исключения

3) Если SeedSeq не является std::seed_seq , выбрасывает исключения, выброшенные вызовом seq.generate .

Пример

#include <cassert>
#include <random>
int main()
{
    std::mt19937 gen32; // overload (1)
    std::mt19937_64 gen64; // overload (1)
    gen32.discard(10000 - 1);
    gen64.discard(10000 - 1);
    assert(gen32() == 4123659995);
    assert(gen64() == 9981545732273789042ull);
}

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, содержащие исправления дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2181 C++11 overload ( 3 ) would not throw even if the seq.generate call throws propagates the exception
P0935R0 C++11 the default constructor was explicit made implicit

Смотрите также

устанавливает текущее состояние движка
(public member function)