15#ifndef ARCANE_RANDOM_MERSENNE_TWISTER_H
16#define ARCANE_RANDOM_MERSENNE_TWISTER_H
20#include "arcane/utils/FatalErrorException.h"
22#include "arcane/random/RandomGlobal.h"
49 static const Integer word_size =
w;
50 static const Integer state_size = n;
51 static const Integer shift_size = m;
52 static const Integer mask_bits =
r;
53 static const UIntType parameter_a = a;
54 static const Integer output_u = u;
55 static const Integer output_s = s;
57 static const Integer output_t =
t;
59 static const Integer output_l = l;
61 static const bool has_fixed_range =
false;
99 template<
class Generator>
124 for (i = 1; i < n; i++) {
126 x[i] = (1812433253UL * (x[i-1] ^ (x[i-1] >> (
w-2))) + i) &
mask;
138 {
for (Integer i=0;i<n;i++) x[i] = state[i];}
148 template<
class Generator>
154 for(Integer
j = 0;
j < n;
j++)
190 for(Integer i = 0; i <
w; ++i)
197 result_type operator()();
216 for(Integer
j = 0;
j < state_size; ++
j)
217 if(compute(
j) !=
rhs.compute(
j))
229 {
return !(*
this ==
rhs); }
244 return x[ (i + n + index) % (2*n) ];
246 void twist(Integer block);
267template<
class UIntType, Integer w, Integer n, Integer m, Integer r, UIntType a, Integer u,
268 Integer s, UIntType b, Integer t, UIntType c, Integer l, UIntType val>
269void MersenneTwister<UIntType,w,n,m,r,a,u,s,b,t,c,l,val>::twist(
int block)
275 for(Integer
j = n;
j < 2*n;
j++) {
277 x[
j] = x[
j-(n-m)] ^ (y >> 1) ^ (y&1 ? a : 0);
279 }
else if (block == 1) {
282 for(Integer
j = 0;
j < n-m;
j++) {
284 x[
j] = x[
j+n+m] ^ (y >> 1) ^ (y&1 ? a : 0);
288 for(Integer
j = n-m;
j < n-1;
j++) {
290 x[
j] = x[
j-(n-m)] ^ (y >> 1) ^ (y&1 ? a : 0);
294 x[n-1] = x[m-1] ^ (y >> 1) ^ (y&1 ? a : 0);
307template<
class UIntType, Integer
w, Integer n, Integer m, Integer
r,
UIntType a, Integer u,
309inline typename MersenneTwister<UIntType,w,n,m,r,a,u,s,b,t,c,l,val>::result_type
310MersenneTwister<UIntType,w,n,m,r,a,u,s,b,t,c,l,val>::operator()()
330 7,0x31b6ab00,15,0xffe50000,17, 0xa37d3c92>
Mt11213b;
335 7,0x9d2c5680,15,0xefc60000,18, 3346425566U>
Mt19937;
Lecteur des fichiers de maillage via la bibliothèque LIMA.
MersenneTwister(UIntType value)
Constructeur avec initialisation du tableau de graines à partir de la valeur value....
UIntType compute(UIntType index) const
Méthode privée qui retourne l'état du générateur pour l'index index.
MersenneTwister(It &first, It last)
Constructeur avec initialisation du tableau de graines à partir de la méthode seed(first,...
result_type min() const
min() retourne la valeur minimum possible d'une séquence.
MersenneTwister()
Constructeur avec initialisation de la graine à partir de la méthode seed()
bool operator!=(const MersenneTwister &rhs) const
Surdéfinition de l'opérateur !=.
bool operator==(const MersenneTwister &rhs) const
Surdéfinition de l'opérateur ==.
result_type max() const
max() retourne la valeur maximum possible d'une séquence.
void seed()
Initialisation du tableau de graines. L'appel à la méthode seed(5489) est réalisé.
MersenneTwister(Generator &gen)
Constructeur avec initialisation du tableau de graines à partir du générateur gen....
UIntType getState(Integer j)
Méthode qui retourne l'état du générateur pour l'index j. L'état complet du générateur est donnée par...
void seed(UIntType *state)
Initialisation du tableau de graines à partir du tableau state. state doit être un tableau de n éléme...
void seed(Generator &gen)
Initialisation du tableau de graines à partir du générateur gen. gen est une classe qui doit contenir...
static bool validation(result_type v)
Fonction de validation (je ne sais pas trop a quoi elle sert!)
void seed(UIntType value)
Initialisation du tableau de graines à partir de la valeur value. Le tableau de graines de ce générat...
Int32 Integer
Type représentant un entier.