Freigeben über


mersenne_twister Class

Generiert eine zufällige Sequenz durch den Mersenne-Twisteralgorithmus.Beibehalten für Kompatibilität TR1.Verwenden Sie stattdessen mersenne_twister_engine Class.

template<class UIntType,
   int W, int N, int M, int R,
   UIntType A, int U, int S,
   UIntType B, int T, UIntType C, int L>
   class mersenne_twister {
public:
   typedef mersenne_twister<UIntType, W, N, M, R,
      P, U, S, B, T, C, L> _MyT;
   typedef UIntType result_type;
   static const int word_size = W;
   static const int state_size = N;
   static const int shift_size = M;
   static const int mask_bits = R;
   static const int UIntType parameter_a = A;
   static const int output_u = U;
   static const int output_s = S;
   static const UIntType output_b = B;
   static const int output_t = T;
   static const UIntType output_c = C;
   static const int output_l = L;
   static const UIntType default_seed = 5489U;
   explicit mersenne_twister(unsigned long x0 = default_seed);
   mersenne_twister(const mersenne_twister& right);
   mersenne_twister(mersenne_twister& right);
   template<class Gen>
      mersenne_twister(Gen& gen);
   void seed(unsigned long x0 = default_seed);
   template<class Gen>
      void seed(Gen& gen);
   result_type min() const;
   result_type max() const;
   result_type operator()();
   };

Parameter

  • UIntType
    Der vorzeichenlose Ergebnistyp ganze Zahl.

  • W
    Der W-Modulparameter.

  • N
    Der N-Modulparameter.

  • R
    Der R-Modulparameter.

  • A
    Der a-Modulparameter.

  • U
    Der U-Modulparameter.

  • S
    Der S-Modulparameter.

  • B
    Der B-Modulparameter.

  • T
    Der T-Modulparameter.

  • C
    Der C-Modulparameter.

  • L
    Der L-Modulparameter.

Hinweise

Die Vorlagenklasse beschreibt ein einfaches Modul.Sie enthält einen großen ganzzahliger Wert mit W * (N - 1) + R Bits an.Sie extrahiert W Bits gleichzeitig von diesem hohen Wert und wenn sie alle Bits verwendet wurde, es verzerrt großen Wert, indem sie die Bits verschieben und kombinieren, damit sie einen neuen Satz von hat zu extrahieren Bits.Der Zustand des Moduls ist die letzte NW- Bitwerte verwendet, wenn operator() mindestens N Zeiten aufgerufen wurde; andernfalls MW- Bitwerte, die verwendet wurden und die letzten N - M-Werte des Startwerts.

Das Vorlagenargument UIntType muss groß genug sein, Werte bis zu 2W - 1 aufzunehmen.Die Werte der anderen Vorlagenargumente müssen die folgenden Anforderungen erfüllen:

0 < M <= N

0 <= R, U, S, T, L <= W

0 <= A, B, C <= 2W

W * (N - 1) + R muss eine Mersenne-höchsteVollkommenheit sein

Der Generator verzerrt großen Wert, den er enthält, indem Sie den folgenden Code ausführt:

    for (int i = 0; i < N; ++i)
        {
        temp = (x[i] & LMASK) << (W - 1) | (x[i + 1] & HMASK) >> 1;
        if (temp & 1)
            y[i] = (temp >> 1) ^ A ^ x[(i + R) % N];
        else
            y[i] = (temp >> 1) ^ x[(i + R) % N];
        }
        for (int i = 0; i < N; ++i)
            x[i] = y[i];

wobei LMASKW ohne Vorzeichen ist - Bitwert mit den grundlegenden R Bits, die auf 1 festgelegt sind und dem Rest der Bits, die auf 0 festgelegt werden, und HMASK ist die Ergänzen von LMASK.

Der Generator enthält einen aktuellen Index idx initialisiert bis 0 an.Er extrahiert Bits, indem er den folgenden Code ausführt:

    temp = x[idx++];
    temp = temp ^ (temp >> U);
    temp = temp ^ ((temp << S) & B);
    temp = temp ^ ((temp << T) & C);
    temp = temp ^ (temp >> L);

Wenn idxN erreicht, verzerrt der Generator den gespeicherten Wert und legt idx zurück auf 0 fest.

Anforderungen

Header: <random>

Namespace: std

Siehe auch

Referenz

<random>

mersenne_twister::mersenne_twister

mersenne_twister::operator()

mersenne_twister::seed