Classe “aléatoire”
Jeux de hasard et loi de probabilité
Déclaration de la classe Hasard
- Écrire une classe
Hasard
possédant les membres suivants :- deux entiers constants non signés, l’un définissant un nombre maximal de valeurs à tirer aléatoirement, l’autre la valeur maximale pouvant être générée aléatoirement (cf. Addendum 1 relatif aux générateurs aléatoires),
- un tableau dynamique de valeurs entières non signées qui sauvegardera les résultats des tirages aléatoires successifs.
- Déclarer un constructeur qui initialisera les membres de la classe en attachant une attention particulière à allouer correctement l’espace mémoire nécessaire.
- Déclarer un destructeur de classe qui restituera l’espace mémoire alloué dynamiquement.
- Surdéfinir une méthode permettant d’afficher soit l’ensemble des tirages aléatoires soit le \(i\)ème tirage.
- Définir une méthode de comparaison de deux instances de
Hasard
retournant un booléen dont la valeur sera soittrue
soitfalse
selon que les deux instances sont identiques ou pas.
Exécuter plusieurs fois le programme en affichant l’ensemble des valeurs générées. Proposer une solution visant à générer, pour chaque exécution, une nouvelle série de valeurs aléatoires.
Décompte du nombre d’instanciation de la classe Hasard
En utilisant un membre statique (cf. Addendum 2), déterminer le nombre d’objets créés au cours de l’exécution du programme.
De la même manière, utiliser un membre statique afin d’estimer le nombre total d’occurences de la valeur 0.
Addendum 1
La librairie standard cstdlib
du C++ fournit un générateur de nombre
pseudo-aléatoire rand()
retournant une valeur entière comprise entre 0 et
RAND_MAX
. Suivant les architectures, RAND_MAX
peut varier d’une machine à
l’autre. Par ailleurs, comme un générateur de nombres aléatoires est exécuté sur
un ordinateur par nature déterministe, il devient de facto un algorithme
déterministe. Ses sorties sont inévitablement entachées d’une caractéristique
absente d’une vraie suite aléatoire : la périodicité. Avec des ressources
limitées (mémoire, nombre de registres, …), le générateur retrouvera le même
état interne. Un générateur non périodique n’est pas impossible, mais nécessite
une mémoire croissante pour ne pas se retrouver dans le même état. Pour
contourner cet obstacle théorique, le générateur peut commencer dans un état
quelconque (la “graine”, seed en anglais). L’initialisation se fait par
l’intermédiaire de la méthode srand(int seed)
qui prend pour argument la
graine. Il produira toutefois la même séquence de nombres aléatoires si la graine
reste identique.
Addendum 2
Les différentes instances d’une classe ont toutes les mêmes méthodes. Mais chaque instance a ses propres membres. Un membre statique est, par définition, un membre qui est le même, i.e. situé dans le même espace mémoire, pour toutes les instances de la classe. La syntaxe de sa déclaration est la suivante:
class nom_classe { ... static type nom_variable_statique; ... };
Un membre statique doit être initialisé explicitement dans le fichier .cc
correspondant à la classe, avec la syntaxe suivante:
type nom_classe::nom_variable_statique = valeur_initiale;