Compilation, pointeur & références Spécificités du C++ Classes en C++ Fraction de nombres complexes Constructeur & destructeurs Surcharge d'opérateur Polymorphisme & classe abstraite Jeu du blackjack
Retour menu principal

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 soit true soit false 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;