Condividi tramite


mersenne_twister_engine Class

Genera una sequenza casuale dall'algoritmo di tornado di Mersenne.

template<class UIntType,
   size_t W, size_t N, size_t M, size_t R,
   UIntType A, size_t U,
   UIntType D, size_t S,
   UIntType B, size_t T,
   UIntType C, size_t L
   UIntType F>
class mersenne_twister_engine {
public:
   typedef UIntType result_type;
   static const size_t word_size = W;
   static const size_t state_size = N;
   static const size_t shift_size = M;
   static const size_t mask_bits = R;
   static const UIntType xor_mask = A;
   static const size_t tempering_u = U;
   static const size_t tempering_d = D;
   static const size_t tempering_s = S;
   static const UIntType tempering_b = B;
   static const size_t tempering_t = T;
   static const UIntType tempering_c = C;
   static const size_t tempering_l = L;
   static const UIntType initialization_multiplier = C;
   static const result_type default_seed = 5489U;
   explicit mersenne_twister_engine(unsigned long x0 = default_seed);
   explicit mersenne_twister_engine(seed_seq& seq);
   void seed(unsigned long x0 = default_seed);
   template<class Gen>
      void seed(seed_seq& seq);
   result_type min() const;
   result_type max() const;
   result_type operator()();
   void discard(unsigned long long count)();
   };

Parametri

  • UIntType
    Il tipo di risultato intero senza segno.

  • W
    Il parametro di modulo a W.

  • N
    Il parametro del motore N.

  • M
    Il parametro del motore m.

  • R
    Il parametro del motore R.

  • A
    Il parametro del motore di Su.

  • U
    Il parametro del motore U.

  • D
    Il parametro del motore D.

  • S
    Il parametro del motore di.

  • B
    Il parametro del motore di B.

  • T
    Il parametro del motore T.

  • C
    Il parametro del motore di C.

  • L
    La Pre-elaborazione parametro del modulo.

  • F
    Il parametro del motore f.

Note

Questa classe modello viene descritto <random>.Utilizza un valore elevato integrale con i bit W * (N - 1) + R.Estrae i bit W per volta da questo valore elevato e quando utilizzava tutti i bit torce il valore elevato scorrendo e combinando i bit in modo che abbia un nuovo set bit di estrarre da.Lo stato del motore è l'ultimo NW- valori di bit utilizzati se operator() è stato chiamato almeno tempi N in caso contrario, MW- valori di bit utilizzati e gli ultimi valori N - M inizio.

Un argomento di template UIntType deve essere sufficiente per contenere valori fino a 2W - 1.I valori degli altri argomenti di modello devono soddisfare i requisiti seguenti:

1 < M <= N

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

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

W * (N - 1) + R deve essere una perfezione di Mersenne

Il generatore torce il valore elevato che utilizza eseguendo il codice seguente:

    for (size_t i = 0; i < N; ++i)
        {    // twist
        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 (size_t i = 0; i < N; ++i)
            x[i] = y[i];

dove LMASK è Wsenza segno (il valore di bit con i bit significativi R impostate su 1 e il resto dei bit impostati su 0 e HMASK è il complemento LMASK.

Il generatore è contenuta un indice corrente idx inizializzato su 0.Estrae i bit eseguendo il codice seguente:

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

Quando idx raggiunge N il generatore torce il valore archiviato e imposta idx di nuovo su 0.

Requisiti

intestazione: <random>

Spazio dei nomi: deviazione standard

Vedere anche

Riferimenti

<random>

mersenne_twister_engine::discard

mersenne_twister_engine::mersenne_twister_engine

mersenne_twister_engine::operator()

mersenne_twister_engine::seed