Compartir a través de


mersenne_twister Class

Genera una secuencia aleatoria por el algoritmo de tornado de Mersenne.Retenido por compatibilidad TR1.Utilice mersenne_twister_engine Class en su lugar.

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

Parámetros

  • UIntType
    El tipo de resultado de entero sin signo.

  • W
    El parámetro del motor del w.

  • N
    El parámetro del motor de n.

  • R
    El parámetro del motor de r.

  • A
    El parámetro del motor de A.

  • U
    El parámetro del motor de U.

  • S
    El parámetro del motor de s.

  • B
    El parámetro del motor de b.

  • T
    El parámetro del motor de t.

  • C
    El parámetro del motor de C.

  • L
    El parámetro del motor de l.

Comentarios

la clase de plantilla describe un motor simple.Contiene un valor entero grande con los bits de W * (N - 1) + R .Extrae los bits de W al mismo tiempo de este valor grande y, cuando ha utilizado todos los bits se distorsiona el valor grande moviendo y mezclando los bits de modo que tenga un nuevo conjunto de bits a extraer de.El estado del motor es NpasadoW- valores de bit utilizados si operator() se ha llamado al menos los tiempos de N , si no MW- valores de bit se han utilizado que los valores pasados de N - M seed.

El argumento UIntType template debería ser lo bastante grande para contener valores hasta 2W - 1.Los valores de los otros argumentos de plantilla deben cumplir los siguientes requisitos:

0 < M <= N

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

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

W * (N - 1) + R debe ser una bonificación en Mersenne

El generador distorsiona el valor grande que copia ejecutando el código siguiente:

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

donde es WLMASK sin signo - el valor de bit con los bits bajos de R establecidos en 1 y el resto de los bits establecidos en 0, y HMASK es el complemento de LMASK.

El generador contiene un índice idx actual de inicializado a 0.extrae los bits ejecutando el código siguiente:

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

Cuando idx alcanza N el generador distorsiona el valor almacenado y establece idx a 0.

Requisitos

encabezado: <aleatorio>

espacio de nombres: std

Vea también

Referencia

<random>

mersenne_twister::mersenne_twister

mersenne_twister::operator()

mersenne_twister::seed