Cours gratuit: Les nombres aléatoires en Langage C

Sommaire: Nombres Aléatoires en Langage C

I – Introduction
II – Les fonctions du C
II-A – rand
II-B – srand
III – Une méthode (trop) simple
IV – Mettons-y notre grain de sable
V – Fixons des limites
VI – Jouons à la loterie
VII – Comment calculer le hasard
VIII – Conclusion
IX – Remerciements

♣ Extrait du cours

Introduction

Pour commencer, je tiens à rectifier le titre de ce tutoriel. En effet avec un ordinateur il est impossible de générer une suite de nombres réellement aléatoires, nous devrons nous contenter de nombres pseudo-aléatoires.
Je vais donc vous proposer plusieurs méthodes, de la plus simple à la plus compliquée, pour obtenir une série de nombres difficilement déterminable à l’avance (dite plus communément aléatoire).

Les fonctions du C

Avant de nous lancer dans la pratique, voici une brève description des fonctions permettant d’obtenir un nombre pseudo-aléatoire en C. Ces fonctions sont déclarées dans stdlib.h.
II-A – rand
Prototype :
int rand(void);
C’est cette fonction qui retourne un nombre aléatoire à chaque appel. Ce nombre est compris entre 0 et RAND_MAX.
II-B – srand
Prototype :
void srand(unsigned int seed);
La fonction srand permet d’initialiser le générateur de nombres pseudo-aléatoires avec une graine différente (1 par défaut). Elle ne doit être appelée qu’une seule fois avant tout appel à rand.

Mettons-y notre grain de sable

Vous l’aurez sans doute deviné, pour éviter de retrouver la même suite de nombres à chaque exécution du programme, il faut modifier la graine, et donc appeler srand à chaque démarrage du programme avec une graine différente. Il y a une valeur qui est différente à chaque appel du programme : l’heure. En initialisant le générateur avec l’heure actuelle, on devrait obtenir une suite de nombres différente à chaque fois :
int my_rand (void)
{
static int first = 0;
if (first == 0)
{
srand (time (NULL));
first = 1;
}
return (rand ());
}
La liste change à chaque appel à condition que intervalle de temps entre deux appels ne soit pas trop court (plus d’une seconde), sinon la suite de nombre sera la même puisque la valeur retournée par time sera la même.

Nombres Aléatoires en Langage C
Fixons des limites
Jusqu’à présent, les valeurs obtenues sont comprises entre 0 et RAND_MAX. Il serait intéressant de limiter l’intervalle de valeurs de 0 à N-1. Pour commencer, une méthode simple consiste à utiliser l’opérateur modulo (extrait de la FAQ C) :
#include <stdlib.h>
int randomValue;
randomValue = rand() % N;
Cette méthode ne fournit pas une distribution homogène des données (sauf si N est un multiple de RAND_MAX). En effet prenons l’exemple où N est égal à 10 et RAND_MAX à 25 :
Nous obtenons plus de nombres compris entre 0 et 5, pour pallier ce problème, il faut réaliser une « mise à l’échelle »
(extrait de la FAQ C) :
#include <stdlib.h>
int randomValue = (int)(rand() / (double)RAND_MAX * (N – 1));
Jouons à la loterie
Pour ajouter une dose de hasard notre générateur va, lors du premier appel, créer un tableau de nombres aléatoires, puis à chaque nouvel appel un nombre sera pris au hasard dans ce tableau, sauvegardé pour être retourné par la fonction et pour finir remplacez par un nouveau nombre aléatoire : il s’agit de l’algorithme de C. Bays et S.D.Durham.

.………

Cours pdf

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *