Partager via


mersenne_twister Class

Génère une séquence aléatoire par l'algorithme de tornade de Mersenne.Conservé pour la compatibilité TR1.Utilisez plutôt 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()();
   };

Paramètres

  • UIntType
    Le type de résultat d'entier non signé.

  • W
    Le paramètre du moteur de W.

  • N
    Le paramètre du moteur N.

  • R
    Le paramètre du moteur de R.

  • A
    Le paramètre du moteur d'Un.

  • U
    Le paramètre du moteur d'U.

  • S
    Le paramètre du moteur de.

  • B
    Le paramètre du moteur de B.

  • T
    Le paramètre du moteur de T.

  • C
    Le paramètre du moteur C.

  • L
    L paramètre du moteur.

Notes

La classe de modèle décrit un moteur simple.Elle stocke une grande valeur intégrale avec les bits d' W * (N - 1) + R .Elle extrait les bits d' W à la fois de cette valeur élevée, et lorsqu'il a utilisé tous les bits il tord la grande valeur en déplaçant et en combinant les bits afin qu'elle dispose d'un nouvel ensemble de bits à récupérer à partir de.L'état du moteur est dernier NW- valeurs de bits utilisées si operator() a été appelé au moins les temps d' N , sinon MW- les valeurs de bits utilisées et les dernières valeurs d' N - M de la valeur de départ.

L'argument template UIntType doit être suffisamment grande pour contenir des valeurs jusqu'à 2W - 1.Les valeurs des autres arguments template doivent répondre aux exigences suivantes :

0 < M <= N

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

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

W * (N - 1) + R doit être un nombre premier de Mersenne

Le concepteur tord la valeur élevée qu'il contient en exécutant le code suivant :

    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];

où LMASK est Wnon signé (la valeur de bits avec ses bas bits d' R définis à 1 et le reste de ses bits définis à 0, et l' HMASK est le complément d' LMASK.

Le concepteur juge un index idx comme tableau initialisé à 0.Il récupère les bits en exécutant le code suivant :

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

Lorsque idx atteint N le concepteur tord la valeur stockée et définit idx à 0.

Configuration requise

en-tête : <random>

l'espace de noms : DST

Voir aussi

Référence

<random>

mersenne_twister::mersenne_twister

mersenne_twister::operator()

mersenne_twister::seed