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