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) (seit C++11)
explicit mersenne_twister_engine ( result_type value ) ;
(2) (seit C++11)
template < class SeedSeq >
explicit mersenne_twister_engine ( SeedSeq & seq ) ;
(3) (seit C++11)
mersenne_twister_engine ( const mersenne_twister_engine & other ) ;
(4) (seit C++11)
(implizit deklariert)

Konstruiert die Pseudo-Zufallszahlen-Engine.

1) Der Standardkonstruktor.
  • Wenn die standardmäßig konstruierte Engine vom Typ std::mt19937 ist, erzeugt der 10000. aufeinanderfolgende Aufruf den Wert 4123659995 .
  • Wenn die standardmäßig konstruierte Engine vom Typ std::mt19937_64 ist, erzeugt der 10000. aufeinanderfolgende Aufruf den Wert 9981545732273789042 .
2) Konstruiert die Engine mit einem Seed-Wert value . Mit 2 w
als p wird der initiale Zustand der Engine wie folgt bestimmt:
  1. Setzt X -n auf value % p .
  2. Für jede ganze Zahl i in [ i - n , - 1 ] wird X i gesetzt auf [f·(X i-1 xor (X i-1 rshift (w-2)))+i mod n] mod p , wobei xor und rshift für die eingebauten bitweisen XOR- bzw. Rechtsverschiebungsoperationen stehen.
3) Konstruiert die Engine mit einer Seed-Sequenz seq . Mit std:: size_t ( w / 32 ) + 1 als k wird der anfängliche Zustand der Engine wie folgt bestimmt:
  1. Erzeugt ein imaginäres Array-Objekt a der Länge n * k .
  2. Ruft seq. generate ( a + 0 , a + n * k ) auf.
  3. Setzt für jede ganze Zahl i in [ - n , - 1 ] den Wert X i auf (∑ k-1
    j=0
    a k(i+n)+j ·2 32j
    ) mod 2 w
    .
  4. Falls die höchstwertigen w − r Bits von X -n null sind und alle anderen resultierenden X i den Wert 0 haben, wird X -n auf 2 w-1
    geändert.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn SeedSeq die Anforderungen von SeedSequence erfüllt.
4) Der Kopierkonstruktor. Bei der Konstruktion gilt, * this == other ist true .

Inhaltsverzeichnis

Parameter

value - Startwert für die Initialisierung des internen Zustands
seq - Startsequenz für die Initialisierung des internen Zustands

Komplexität

1,2) O(n) .
3) Gleich wie die Komplexität des seq.generate Aufrufs.
4) O(n) .

Ausnahmen

3) Wenn SeedSeq nicht std::seed_seq ist, werden die Ausnahmen ausgelöst, die durch den seq.generate -Aufruf geworfen werden.

Beispiel

#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);
}

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2181 C++11 Überladung ( 3 ) würde nicht werfen, selbst wenn der seq.generate Aufruf wirft leitet die Exception weiter
P0935R0 C++11 der Standardkonstruktor war explizit implizit gemacht

Siehe auch

setzt den aktuellen Zustand der Engine
(öffentliche Elementfunktion)