Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
nombres_aleatoires [2015/08/01 15:23] 37.163.102.2 [Rappel sur les distributions statistiques] |
nombres_aleatoires [2018/08/30 20:35] (Version actuelle) gbdivers |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^ | + | ^ [[definir_ses_types|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[collection|Chapitre suivant]] ^ |
- | ====== Les nombres pseudo-aléatoires ====== | + | ====== [Aller plus loin] Les nombres pseudo-aléatoires ====== |
Un nombre aléatoire est un nombre dont la valeur est choisie au hasard. Ils sont utilisés dans de nombreux contextes, par exemple dans les jeux vidéo (pour avoir un comportement non prédictible), en cryptographie (pour encoder des informations), ou dans les tests automatisés de code (pour vérifier le comportement d'un programme avec des valeurs indéterminées). Vous verrez dans différents projets de ce cours des cas d'utilisation des nombres aléatoires. | Un nombre aléatoire est un nombre dont la valeur est choisie au hasard. Ils sont utilisés dans de nombreux contextes, par exemple dans les jeux vidéo (pour avoir un comportement non prédictible), en cryptographie (pour encoder des informations), ou dans les tests automatisés de code (pour vérifier le comportement d'un programme avec des valeurs indéterminées). Vous verrez dans différents projets de ce cours des cas d'utilisation des nombres aléatoires. | ||
Ligne 145: | Ligne 145: | ||
#include <iostream> | #include <iostream> | ||
#include <random> | #include <random> | ||
- | #include <chrono> | + | #include <ctime> |
int main() { | int main() { | ||
Ligne 240: | Ligne 240: | ||
==== Les générateurs standard de distribution ==== | ==== Les générateurs standard de distribution ==== | ||
- | La bibliothèque standard du C++ contient d'autres distributions que les distributions uniformes et normale. Vous pouvez avoir le détail dans la [[http://en.cppreference.com/w/cpp/numeric/random|documentation]] pour les fonctions à utiliser et sur [[https://fr.wikipedia.org/wiki/Liste_de_lois_de_probabilit%C3%A9|Wikipédia]] pour les explications sur les propriétés des distributions. Dans la majorité des cas, les deux distributions citées seront suffisantes, nous verrons que cela là dans la suite du cours. | + | La bibliothèque standard du C++ contient d'autres distributions que les distributions uniformes et normale. Vous pouvez avoir le détail dans la [[http://en.cppreference.com/w/cpp/numeric/random|documentation]] pour les fonctions à utiliser et sur [[https://fr.wikipedia.org/wiki/Liste_de_lois_de_probabilit%C3%A9|Wikipédia]] pour les explications sur les propriétés des distributions. Dans la majorité des cas, les deux distributions citées seront suffisantes, nous verrons cela dans la suite du cours. |
Il existe deux distributions uniformes et une normale : | Il existe deux distributions uniformes et une normale : | ||
Ligne 261: | Ligne 261: | ||
* valeurs minimale et maximale pour les générateurs de loi uniforme ; | * valeurs minimale et maximale pour les générateurs de loi uniforme ; | ||
* moyenne et déviation standard pour le générateur de loi normale. | * moyenne et déviation standard pour le générateur de loi normale. | ||
- | |||
- | __ ajouter une figure __ | ||
Le code C++ correspond est relativement similaire à ce que vous avez déjà vu. | Le code C++ correspond est relativement similaire à ce que vous avez déjà vu. | ||
Ligne 316: | Ligne 314: | ||
Les valeurs 5 et 1 correspondent aux paramètres de la distribution. Elles ne sont pas utilisées lors de la compilation, mais uniquement lors de l'exécution. | Les valeurs 5 et 1 correspondent aux paramètres de la distribution. Elles ne sont pas utilisées lors de la compilation, mais uniquement lors de l'exécution. | ||
- | <note>La séparation de la phase de compilation (//compile-time//) et lors de la phase d'exécution (//runtime//) est une notion importante en C++. Il est nécessaire de bien comprendre ce qui est fait à chaque étape. Vous verrez cette notion régulièrement.</note> | + | <note>La séparation de la phase de compilation (//compile-time//) et de la phase d'exécution (//runtime//) est une notion importante en C++. Il est nécessaire de bien comprendre ce qui est fait à chaque étape. Vous verrez cette notion régulièrement.</note> |
==== Génération ==== | ==== Génération ==== | ||
Ligne 324: | Ligne 322: | ||
<code cpp main.cpp> | <code cpp main.cpp> | ||
std::normal_distribution<float> normal(0, 1); // initialisation | std::normal_distribution<float> normal(0, 1); // initialisation | ||
- | const auto value = normal(engin); // génération | + | auto const value = normal(engin); // génération |
</code> | </code> | ||
- | Contrairement aux générateurs aléatoires qui ne prennent pas d'argument, les générateurs de distribution prennent en argument le générateur aléatoire à utiliser. A chaque fois que le générateur de distribution est appelé, il appelle en interne le générateur aléatoire pour générer un nombre aléatoire, puis l'adapte en fonction de la distribution. | + | Contrairement aux générateurs aléatoires qui ne prennent pas d'argument, les générateurs de distribution prennent en argument le générateur aléatoire à utiliser. À chaque fois que le générateur de distribution est appelé, il appelle en interne le générateur aléatoire pour générer un nombre aléatoire, puis l'adapte en fonction de la distribution. |
Pour résumer l'utilisation des générateurs de distributions, ceux-ci utilisent trois sources d'information pour générer un nombre : | Pour résumer l'utilisation des générateurs de distributions, ceux-ci utilisent trois sources d'information pour générer un nombre : | ||
* le type de valeur générée (le type passé en argument entre chevrons, qui sera le même type que la variable ''value'' avec ''auto'') ; | * le type de valeur générée (le type passé en argument entre chevrons, qui sera le même type que la variable ''value'' avec ''auto'') ; | ||
- | * le type de distribution et ses paramètres (définies lors de l'initialisation du générateur de distribution) ; | + | * le type de distribution et ses paramètres (définis lors de l'initialisation du générateur de distribution) ; |
- | * le générateur aléatoire utilisé (définie lors de la génération des nombres). | + | * le générateur aléatoire utilisé (défini lors de la génération des nombres). |
===== Pour résumer ===== | ===== Pour résumer ===== | ||
- | Au final, vous devriez avoir un code similaire à cela pour générer un nombre aléatoire (adapter selon le type de distribution) : | + | Au final, vous devriez avoir un code similaire à cela pour générer un nombre aléatoire (à adapter selon le type de distribution) : |
<code cpp main.cpp> | <code cpp main.cpp> | ||
#include <iostream> | #include <iostream> | ||
#include <random> | #include <random> | ||
- | #include <chrono> | + | #include <ctime> |
int main() { | int main() { | ||
- | const auto seed = std::time(nullptr); // génération de la graine | + | auto const seed = std::time(nullptr); // génération de la graine |
std::default_random_engine engin { seed }; // générateur aléatoire | std::default_random_engine engin { seed }; // générateur aléatoire | ||
std::normal_distribution<float> normal(0, 1); // générateur de distribution | std::normal_distribution<float> normal(0, 1); // générateur de distribution | ||
Ligne 354: | Ligne 352: | ||
===== Travaux pratiques ===== | ===== Travaux pratiques ===== | ||
- | 1. Donner une série de nombres aléatoires, produit avec un algo (donné ou non), une graine comprise entre 0 et 100. Essayer de retrouver la graine/algo __ probablement à faire plus tard, après les boucles et tests__ | + | 1. Donner une série de nombres aléatoires, produit avec un algo/graine (donné ou non), une graine comprise entre 0 et 100. Essayer de retrouver la graine/algo __ probablement à faire plus tard, après les boucles et tests__ |
2. __exos : proposer des exos avec fonctions de calculs et affiche déjà écrit__ | 2. __exos : proposer des exos avec fonctions de calculs et affiche déjà écrit__ | ||
- | ^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^ | + | |
+ | ^ [[definir_ses_types|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[collection|Chapitre suivant]] ^ |