Erwartungswert einer diskreten Verteilung in C berechnen

CCBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie man den Erwartungswert einer diskreten Verteilung in der C-Programmiersprache berechnet. Das Lab umfasst die folgenden Schritte: Lesen der Werte und Wahrscheinlichkeiten, Berechnung des Erwartungswertes durch Summierung des Produkts jedes Wertes und seiner entsprechenden Wahrscheinlichkeit und Ausgabe des Endergebnisses. Das Programm ermöglicht es den Benutzern, die Anzahl der Ergebnisse, die Werte und ihre jeweiligen Wahrscheinlichkeiten einzugeben und anschließend die eingegebenen Werte zur Überprüfung anzuzeigen. Dieses Lab zielt darauf ab, ein praktisches Verständnis von Wahrscheinlichkeit und Kombinatorik mithilfe von C zu vermitteln, eine wertvolle Fähigkeit in verschiedenen Bereichen wie Datenanalyse, maschinellem Lernen und Entscheidungsfindung.

Werte und Wahrscheinlichkeiten einlesen

In diesem Schritt lernen Sie, wie Sie Werte und Wahrscheinlichkeiten zum Berechnen des Erwartungswertes einer diskreten Verteilung in C einlesen. Wir erstellen ein Programm, das es Benutzern ermöglicht, mehrere Werte und ihre entsprechenden Wahrscheinlichkeiten einzugeben.

Erstellen Sie zunächst eine neue C-Datei im Verzeichnis ~/project:

cd ~/project
nano expected_value.c

Schreiben Sie nun den Anfangscode zum Einlesen von Werten und Wahrscheinlichkeiten:

#include <stdio.h>

#define MAX_OUTCOMES 10

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

    printf("Geben Sie die Anzahl der Ergebnisse ein (max %d): ", MAX_OUTCOMES);
    scanf("%d", &num_outcomes);

    // Werte eingeben
    printf("Geben Sie die Werte ein:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Wert %d: ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Wahrscheinlichkeiten eingeben
    printf("Geben Sie die Wahrscheinlichkeiten ein:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Wahrscheinlichkeit %d: ", i + 1);
        scanf("%lf", &probabilities[i]);
    }

    // Eingaben zur Überprüfung ausgeben
    printf("\nEingabewerte:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Wert %d: %.2f, Wahrscheinlichkeit %d: %.2f\n",
               i + 1, values[i], i + 1, probabilities[i]);
    }

    return 0;
}

Kompilieren und ausführen Sie das Programm:

gcc expected_value.c -o expected_value
./expected_value

Beispielausgabe:

Geben Sie die Anzahl der Ergebnisse ein (max 10): 3
Geben Sie die Werte ein:
Wert 1: 10
Wert 2: 20
Wert 3: 30
Geben Sie die Wahrscheinlichkeiten ein:
Wahrscheinlichkeit 1: 0.2
Wahrscheinlichkeit 2: 0.5
Wahrscheinlichkeit 3: 0.3

Eingabewerte:
Wert 1: 10.00, Wahrscheinlichkeit 1: 0.20
Wert 2: 20.00, Wahrscheinlichkeit 2: 0.50
Wert 3: 30.00, Wahrscheinlichkeit 3: 0.30

Wichtige Punkte:

  • Wir verwenden Arrays, um Werte und Wahrscheinlichkeiten zu speichern.
  • MAX_OUTCOMES definiert die maximale Anzahl möglicher Ergebnisse.
  • scanf() wird verwendet, um Benutzereingaben für Werte und Wahrscheinlichkeiten zu lesen.
  • Wir geben die Eingabe aus, um die korrekte Dateneingabe zu überprüfen.

Summe (Wert * Wahrscheinlichkeit) über alle Ergebnisse

In diesem Schritt erweitern Sie das vorherige Programm, um den Erwartungswert zu berechnen, indem Sie die Summe jedes Wertes multipliziert mit seiner Wahrscheinlichkeit berechnen.

Öffnen Sie die vorhandene Datei und ändern Sie den Code:

cd ~/project
nano expected_value.c

Aktualisieren Sie den Code, um den Erwartungswert zu berechnen:

#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("Geben Sie die Anzahl der Ergebnisse ein (max %d): ", MAX_OUTCOMES);
    scanf("%d", &num_outcomes);

    // Werte eingeben
    printf("Geben Sie die Werte ein:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Wert %d: ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Wahrscheinlichkeiten eingeben
    printf("Geben Sie die Wahrscheinlichkeiten ein:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Wahrscheinlichkeit %d: ", i + 1);
        scanf("%lf", &probabilities[i]);
    }

    // Erwartungswert berechnen
    for (int i = 0; i < num_outcomes; i++) {
        expected_value += values[i] * probabilities[i];
    }

    // Ergebnisse ausgeben
    printf("\nBerechnungsdetails:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Wert %d: %.2f * Wahrscheinlichkeit %d: %.2f = %.2f\n",
               i + 1, values[i], i + 1, probabilities[i],
               values[i] * probabilities[i]);
    }
    printf("\nErwartungswert: %.2f\n", expected_value);

    return 0;
}

Kompilieren und ausführen Sie das aktualisierte Programm:

gcc expected_value.c -o expected_value
./expected_value

Beispielausgabe:

Geben Sie die Anzahl der Ergebnisse ein (max 10): 3
Geben Sie die Werte ein:
Wert 1: 10
Wert 2: 20
Wert 3: 30
Geben Sie die Wahrscheinlichkeiten ein:
Wahrscheinlichkeit 1: 0.2
Wahrscheinlichkeit 2: 0.5
Wahrscheinlichkeit 3: 0.3

Berechnungsdetails:
Wert 1: 10.00 * Wahrscheinlichkeit 1: 0.20 = 2.00
Wert 2: 20.00 * Wahrscheinlichkeit 2: 0.50 = 10.00
Wert 3: 30.00 * Wahrscheinlichkeit 3: 0.30 = 9.00

Erwartungswert: 21.00

Wichtige Punkte:

  • Wir führen expected_value ein, um die Summe von Wert * Wahrscheinlichkeit zu speichern.
  • Die for-Schleife berechnet jeden Term und summiert den Gesamtbetrag.
  • Wir geben detaillierte Berechnungsschritte aus, um zu zeigen, wie der Erwartungswert berechnet wird.
  • Der Beitrag jedes Ergebnisses wird als (Wert * Wahrscheinlichkeit) angezeigt.

Ausgabe des Erwartungswertes

In diesem letzten Schritt verbessern Sie das Programm, um eine detailliertere Ausgabe und eine verbesserte Benutzererfahrung bei der Anzeige des Erwartungswertes zu erhalten.

Öffnen Sie die vorhandene Datei und nehmen Sie die endgültigen Änderungen vor:

cd ~/project
nano expected_value.c

Aktualisieren Sie den Code mit verbesserter Formatierung und Fehlerprüfung:

#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("Erwartungswert-Rechner\n");
    printf("======================\n");

    // Eingabe der Anzahl der Ergebnisse
    do {
        printf("Geben Sie die Anzahl der Ergebnisse (1-%d) ein: ", MAX_OUTCOMES);
        scanf("%d", &num_outcomes);

        if (num_outcomes < 1 || num_outcomes > MAX_OUTCOMES) {
            printf("Ungültige Anzahl der Ergebnisse. Bitte versuchen Sie es erneut.\n");
        }
    } while (num_outcomes < 1 || num_outcomes > MAX_OUTCOMES);

    // Eingabe der Werte
    printf("\nWerte eingeben:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Wert %d: ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Eingabe der Wahrscheinlichkeiten mit Validierung
    printf("\nWahrscheinlichkeiten eingeben:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Wahrscheinlichkeit %d: ", i + 1);
        scanf("%lf", &probabilities[i]);
        total_probability += probabilities[i];
    }

    // Validierung der Gesamtwahrscheinlichkeit
    if (total_probability < 0.99 || total_probability > 1.01) {
        printf("\nWARNUNG: Die Wahrscheinlichkeiten summieren sich nicht zu 1,0 (aktuelle Summe: %.2f)\n",
               total_probability);
    }

    // Berechnung des Erwartungswertes
    for (int i = 0; i < num_outcomes; i++) {
        expected_value += values[i] * probabilities[i];
    }

    // Ausgabe der detaillierten Ergebnisse
    printf("\n--- Berechnungsdetails ---\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Ergebnis %d: Wert = %.2f, Wahrscheinlichkeit = %.2f\n",
               i + 1, values[i], probabilities[i]);
        printf("  Beitrag: %.2f * %.2f = %.2f\n",
               values[i], probabilities[i], values[i] * probabilities[i]);
    }

    // Ausgabe des endgültigen Erwartungswertes
    printf("\n=== Erwartungswert ===\n");
    printf("E(X) = %.2f\n", expected_value);

    return 0;
}

Kompilieren und ausführen Sie das endgültige Programm:

gcc expected_value.c -o expected_value
./expected_value

Beispielausgabe:

Erwartungswert-Rechner
======================
Geben Sie die Anzahl der Ergebnisse (1-10) ein: 3

Werte eingeben:
Wert 1: 10
Wert 2: 20
Wert 3: 30

Wahrscheinlichkeiten eingeben:
Wahrscheinlichkeit 1: 0.2
Wahrscheinlichkeit 2: 0.5
Wahrscheinlichkeit 3: 0.3

--- Berechnungsdetails ---
Ergebnis 1: Wert = 10.00, Wahrscheinlichkeit = 0.20
  Beitrag: 10.00 * 0.20 = 2.00
Ergebnis 2: Wert = 20.00, Wahrscheinlichkeit = 0.50
  Beitrag: 20.00 * 0.50 = 10.00
Ergebnis 3: Wert = 30.00, Wahrscheinlichkeit = 0.30
  Beitrag: 30.00 * 0.30 = 9.00

=== Erwartungswert ===
E(X) = 21.00

Wichtige Verbesserungen:

  • Hinzugefügte Eingabevalidierung für die Anzahl der Ergebnisse
  • Überprüfte Gesamtwahrscheinlichkeitssumme
  • Verbesserte Ausgabeformatierung
  • Angezeigt einzelne Ergebnisbeiträge
  • Deutlich angezeigter endgültiger Erwartungswert

Zusammenfassung

In diesem Labor lernen Sie, wie Sie Werte und Wahrscheinlichkeiten einlesen und anschließend den Erwartungswert einer diskreten Verteilung in C berechnen. Zuerst erstellen Sie ein Programm, das es Benutzern ermöglicht, mehrere Werte und ihre entsprechenden Wahrscheinlichkeiten einzugeben. Anschließend lernen Sie, wie Sie das Produkt aus jedem Wert und seiner Wahrscheinlichkeit summieren, um den Erwartungswert zu berechnen. Schließlich geben Sie den berechneten Erwartungswert aus.

Die in diesem Labor behandelten wichtigen Punkte umfassen die Verwendung von Arrays zum Speichern von Werten und Wahrscheinlichkeiten, die Definition einer maximalen Anzahl möglicher Ergebnisse und die Verwendung der Funktion scanf(), um Benutzereingaben zu lesen. Das Programm stellt sicher, dass die eingegebenen Werte und Wahrscheinlichkeiten zur Überprüfung ausgegeben werden, bevor mit dem nächsten Schritt fortgefahren wird.