std::mersenne_twister_engine<UIntType,w,n,m,r,a,u,d,s,b,t,c,l,f>:: mersenne_twister_engine
From cppreference.net
<
cpp
|
numeric
|
random
|
mersenne twister engine
|
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 , начальное состояние генератора определяется следующим образом:
как p , начальное состояние генератора определяется следующим образом:
- Устанавливает X -n в value % p .
-
Для каждого целого числа
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
, начальное
состояние
генератора определяется следующим образом:
- Создаётся временный массив a длиной n * k .
- Вызывается seq. generate ( a + 0 , a + n * k ) .
-
Для каждого целого числа
i
в
[- n,- 1]устанавливается X i равным (∑ k-1
j=0 a k(i+n)+j ·2 32j
) mod 2 w
. -
Если старшие
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
.
Пример
|
Этот раздел не завершен
Причина: требуются демонстрации для перегрузок (2-4) |
Запустить этот код
#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) |