Calculer la Valeur Attendue d'une Distribution Discrète en C

CBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez à calculer la valeur attendue d'une distribution discrète en langage C. Le laboratoire couvre les étapes suivantes : la lecture des valeurs et des probabilités, le calcul de la valeur attendue en sommant le produit de chaque valeur et de sa probabilité correspondante, et l'impression du résultat final. Le programme permet aux utilisateurs d'entrer le nombre de résultats, les valeurs et leurs probabilités respectives, puis d'afficher les valeurs saisies pour vérification. Ce laboratoire vise à fournir une compréhension pratique de la probabilité et de la combinatoire en utilisant le langage C, une compétence précieuse dans divers domaines, tels que l'analyse de données, l'apprentissage automatique et la prise de décision.

Lecture des valeurs et des probabilités

Dans cette étape, vous apprendrez à lire les valeurs et les probabilités pour calculer la valeur attendue d'une distribution discrète en C. Nous allons créer un programme qui permet aux utilisateurs d'entrer plusieurs valeurs et leurs probabilités correspondantes.

Tout d'abord, créons un nouveau fichier C dans le répertoire ~/project :

cd ~/project
nano expected_value.c

Maintenant, écrivons le code initial pour lire les valeurs et les probabilités :

#include <stdio.h>

#define MAX_OUTCOMES 10

int main() {
    double values[MAX_OUTCOMES];
    double probabilities[MAX_OUTCOMES];
    int num_outcomes;

    printf("Entrez le nombre de résultats (max %d) : ", MAX_OUTCOMES);
    scanf("%d", &num_outcomes);

    // Entrée des valeurs
    printf("Entrez les valeurs :\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valeur %d : ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Entrée des probabilités
    printf("Entrez les probabilités :\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Probabilité %d : ", i + 1);
        scanf("%lf", &probabilities[i]);
    }

    // Affichage des entrées pour vérification
    printf("\nValeurs saisies :\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valeur %d : %.2f, Probabilité %d : %.2f\n",
               i + 1, values[i], i + 1, probabilities[i]);
    }

    return 0;
}

Compilez et exécutez le programme :

gcc expected_value.c -o expected_value
./expected_value

Exemple de sortie :

Entrez le nombre de résultats (max 10) : 3
Entrez les valeurs :
Valeur 1 : 10
Valeur 2 : 20
Valeur 3 : 30
Entrez les probabilités :
Probabilité 1 : 0.2
Probabilité 2 : 0.5
Probabilité 3 : 0.3

Valeurs saisies :
Valeur 1 : 10.00, Probabilité 1 : 0.20
Valeur 2 : 20.00, Probabilité 2 : 0.50
Valeur 3 : 30.00, Probabilité 3 : 0.30

Points clés à comprendre :

  • Nous utilisons des tableaux pour stocker les valeurs et les probabilités.
  • MAX_OUTCOMES définit le nombre maximal de résultats possibles.
  • scanf() est utilisé pour lire les entrées utilisateur pour les valeurs et les probabilités.
  • Nous affichons les entrées pour vérifier la saisie correcte des données.

Somme (valeur * probabilité) sur tous les résultats

Dans cette étape, vous étendrez le programme précédent pour calculer la valeur attendue en calculant la somme de chaque valeur multipliée par sa probabilité.

Ouvrez le fichier existant et modifiez le code :

cd ~/project
nano expected_value.c

Mettez à jour le code pour calculer la valeur attendue :

#include <stdio.h>

#define MAX_OUTCOMES 10

int main() {
    double values[MAX_OUTCOMES];
    double probabilities[MAX_OUTCOMES];
    int num_outcomes;
    double expected_value = 0.0;

    printf("Entrez le nombre de résultats (max %d) : ", MAX_OUTCOMES);
    scanf("%d", &num_outcomes);

    // Entrée des valeurs
    printf("Entrez les valeurs :\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valeur %d : ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Entrée des probabilités
    printf("Entrez les probabilités :\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Probabilité %d : ", i + 1);
        scanf("%lf", &probabilities[i]);
    }

    // Calcul de la valeur attendue
    for (int i = 0; i < num_outcomes; i++) {
        expected_value += values[i] * probabilities[i];
    }

    // Affichage des résultats
    printf("\nDétails du calcul :\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valeur %d : %.2f * Probabilité %d : %.2f = %.2f\n",
               i + 1, values[i], i + 1, probabilities[i],
               values[i] * probabilities[i]);
    }
    printf("\nValeur attendue : %.2f\n", expected_value);

    return 0;
}

Compilez et exécutez le programme mis à jour :

gcc expected_value.c -o expected_value
./expected_value

Exemple de sortie :

Entrez le nombre de résultats (max 10) : 3
Entrez les valeurs :
Valeur 1 : 10
Valeur 2 : 20
Valeur 3 : 30
Entrez les probabilités :
Probabilité 1 : 0.2
Probabilité 2 : 0.5
Probabilité 3 : 0.3

Détails du calcul :
Valeur 1 : 10.00 * Probabilité 1 : 0.20 = 2.00
Valeur 2 : 20.00 * Probabilité 2 : 0.50 = 10.00
Valeur 3 : 30.00 * Probabilité 3 : 0.30 = 9.00

Valeur attendue : 21.00

Points clés à comprendre :

  • Nous introduisons expected_value pour stocker la somme de valeur * probabilité.
  • La boucle for calcule chaque terme et cumule le total.
  • Nous affichons les étapes de calcul détaillées pour montrer comment la valeur attendue est calculée.
  • La contribution de chaque résultat est affichée sous la forme (valeur * probabilité).

Affichage de la Valeur Attendue

Dans cette dernière étape, vous améliorerez le programme pour fournir une sortie plus détaillée et une meilleure expérience utilisateur lors de l'affichage de la valeur attendue.

Ouvrez le fichier existant et apportez les modifications finales :

cd ~/project
nano expected_value.c

Mettez à jour le code avec une mise en forme améliorée et une vérification des erreurs :

#include <stdio.h>

#define MAX_OUTCOMES 10

int main() {
    double values[MAX_OUTCOMES];
    double probabilities[MAX_OUTCOMES];
    int num_outcomes;
    double expected_value = 0.0;
    double total_probability = 0.0;

    printf("Calculateur de Valeur Attendue\n");
    printf("==============================\n");

    // Entrée du nombre de résultats
    do {
        printf("Entrez le nombre de résultats (1-%d) : ", MAX_OUTCOMES);
        scanf("%d", &num_outcomes);

        if (num_outcomes < 1 || num_outcomes > MAX_OUTCOMES) {
            printf("Nombre de résultats invalide. Veuillez réessayer.\n");
        }
    } while (num_outcomes < 1 || num_outcomes > MAX_OUTCOMES);

    // Entrée des valeurs
    printf("\nEntrez les Valeurs :\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valeur %d : ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Entrée des probabilités avec validation
    printf("\nEntrez les Probabilités :\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Probabilité %d : ", i + 1);
        scanf("%lf", &probabilities[i]);
        total_probability += probabilities[i];
    }

    // Validation de la somme des probabilités
    if (total_probability < 0.99 || total_probability > 1.01) {
        printf("\nAVERTISSEMENT : Les probabilités ne totalisent pas 1,0 (somme actuelle : %.2f)\n",
               total_probability);
    }

    // Calcul de la valeur attendue
    for (int i = 0; i < num_outcomes; i++) {
        expected_value += values[i] * probabilities[i];
    }

    // Affichage des résultats détaillés
    printf("\n--- Détails du Calcul ---\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Résultat %d : Valeur = %.2f, Probabilité = %.2f\n",
               i + 1, values[i], probabilities[i]);
        printf("  Contribution : %.2f * %.2f = %.2f\n",
               values[i], probabilities[i], values[i] * probabilities[i]);
    }

    // Affichage final de la valeur attendue
    printf("\n=== Valeur Attendue ===\n");
    printf("E(X) = %.2f\n", expected_value);

    return 0;
}

Compilez et exécutez le programme final :

gcc expected_value.c -o expected_value
./expected_value

Exemple de sortie :

Calculateur de Valeur Attendue
==============================
Entrez le nombre de résultats (1-10) : 3

Entrez les Valeurs :
Valeur 1 : 10
Valeur 2 : 20
Valeur 3 : 30

Entrez les Probabilités :
Probabilité 1 : 0.2
Probabilité 2 : 0.5
Probabilité 3 : 0.3

--- Détails du Calcul ---
Résultat 1 : Valeur = 10.00, Probabilité = 0.20
  Contribution : 10.00 * 0.20 = 2.00
Résultat 2 : Valeur = 20.00, Probabilité = 0.50
  Contribution : 20.00 * 0.50 = 10.00
Résultat 3 : Valeur = 30.00, Probabilité = 0.30
  Contribution : 30.00 * 0.30 = 9.00

=== Valeur Attendue ===
E(X) = 21.00

Améliorations clés :

  • Ajout de la validation de l'entrée pour le nombre de résultats.
  • Vérification de la somme des probabilités.
  • Amélioration de la mise en forme de la sortie.
  • Affichage des contributions individuelles des résultats.
  • Affichage clair de la valeur attendue finale.

Résumé

Dans ce laboratoire, vous apprendrez à lire des valeurs et des probabilités, puis à calculer la valeur attendue d'une distribution discrète en C. Tout d'abord, vous créerez un programme permettant aux utilisateurs d'entrer plusieurs valeurs et leurs probabilités correspondantes. Ensuite, vous apprendrez à additionner le produit de chaque valeur et de sa probabilité pour calculer la valeur attendue. Enfin, vous afficherez la valeur attendue calculée.

Les points clés abordés dans ce laboratoire incluent l'utilisation de tableaux pour stocker les valeurs et les probabilités, la définition d'un nombre maximal de résultats possibles, et l'utilisation de la fonction scanf() pour lire les entrées utilisateur. Le programme s'assure que les valeurs et les probabilités saisies sont affichées pour vérification avant de passer à l'étape suivante.