Yahoo refuse tous les emails du site. Si vous avez une adresse chez un autre prestataire, c'est le moment de l'utiliser ;)

En cas de soucis, n'hésitez pas à aller faire un tour sur la page de contact en bas de page.

Topic "Générer des nombres pseudo-aléatoires avec une carte Arduino / Genuino"

Flux RSS des posts récents dans ce topic ( Flux Atom)


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#477 | Signaler ce message


Dans ce tutoriel, nous allons apprendre ensemble à générer des nombres (pseudo) aléatoires avec une carte Arduino / Genuino. En bonus, nous verrons en image pourquoi ces nombres sont dits "pseudo" aléatoires.

Lire la suite de l'article sur le site

Derniére modification le par skywodd


Pas de photo de profil

Firesledge

Membre

#1091 | Signaler ce message


Salut ! Ça faisait longtemps que je n’étais pas venu. En faisant défiler ton blog, je tombe sur cet article dont le sujet m’intéresse. Avant même d’en lire le contenu, j’ai tout de suite scotché sur les barres verticales noires de l’image d’illustration, symptôme typique d’un générateur pseudo-aléatoire (PRNG) de qualité médiocre.

Les PRNG intégrés aux bibliothèques standard sont souvent des générateurs congruenties linéaires (LCG). Ils sont assez simples mais ont des motifs répétitifs qui peuvent être très gênants, même pour des applications non-cryptographiques. On le voit tout de suite sur ton image d’illustration.

De manière générale, les bits de poids faible des LCG sont très peu aléatoire. Si on s’intéresse à un petit intervalle de tirage, il est recommandé de se baser plutôt sur les bits de poids fort. En fait, c’est même vrai pour de nombreux types de PRNG.

Il existe toutefois des générateurs beaucoup plus robustes que les LCG et qui restent très simples à mettre en œuvre. Mon préféré est une fonction de hachage. Elle est peu coûteuse et donne à mon avis de très bon résultats. Il suffit de prendre un compteur, de l’incrémenter à chaque tirage, et d’en hacher la valeur. Exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// La fonction de hachage sur laquelle s'appuie le generateur
uint32_t hash32 (uint32_t x)
{
  x ^= x >> 16;
  x *= uint32_t (0x7FEB352Dlu);
  x ^= x >> 15;
  x *= uint32_t (0x846CA68Blu);
  x ^= x >> 16;
  return x;
}

// Il suffit d'affecter cette variable à n'importe quel moment
// pour changer la graine
uint32_t my_rand_seed = 999;

// Genere un nombre entre 0 et 2^32 - 1
uint32_t my_rand ()
{
  ++ my_rand_seed;
  return hash32 (my_rand_seed);
}

// Genere un nombre entre lb (inclus) et ub (exclus)
// Condition : lb < ub
int my_rand (int lb, int ub)
{
  const auto x   = my_rand ();
  const auto tmp = uint64_t (x) * uint64_t (ub - lb);
  const auto d   = uint32_t (tmp >> 32);
  const auto y   = lb + int (d);
  return y;
}

En espérant que ma contribution sera utile…

Edit : j’ai finalement trouvé la page wikipedia fr pour les LCG

Derniére modification le par Firesledge