Calcular el Valor Esperado de una Distribución Discreta en C

CBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás a calcular el valor esperado de una distribución discreta en el lenguaje de programación C. El laboratorio cubre los siguientes pasos: leer los valores y probabilidades, calcular el valor esperado sumando el producto de cada valor y su probabilidad correspondiente, e imprimir el resultado final. El programa permite a los usuarios introducir el número de resultados, los valores y sus respectivas probabilidades, y luego muestra los valores de entrada para su verificación. Este laboratorio tiene como objetivo proporcionar una comprensión práctica de la probabilidad y la combinatoria utilizando C, una habilidad valiosa en diversos campos, como el análisis de datos, el aprendizaje automático y la toma de decisiones.

Leer Valores y Probabilidades

En este paso, aprenderás a leer valores y probabilidades para calcular el valor esperado de una distribución discreta en C. Crearemos un programa que permita a los usuarios introducir múltiples valores y sus probabilidades correspondientes.

Primero, creemos un nuevo archivo C en el directorio ~/project:

cd ~/project
nano expected_value.c

Ahora, escribamos el código inicial para leer valores y probabilidades:

#include <stdio.h>

#define MAX_OUTCOMES 10

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

    printf("Ingrese el número de resultados (máximo %d): ", MAX_OUTCOMES);
    scanf("%d", &num_outcomes);

    // Ingresar valores
    printf("Ingrese los valores:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valor %d: ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Ingresar probabilidades
    printf("Ingrese las probabilidades:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Probabilidad %d: ", i + 1);
        scanf("%lf", &probabilities[i]);
    }

    // Imprimir la entrada para verificación
    printf("\nValores de entrada:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valor %d: %.2f, Probabilidad %d: %.2f\n",
               i + 1, values[i], i + 1, probabilities[i]);
    }

    return 0;
}

Compila y ejecuta el programa:

gcc expected_value.c -o expected_value
./expected_value

Ejemplo de salida:

Ingrese el número de resultados (máximo 10): 3
Ingrese los valores:
Valor 1: 10
Valor 2: 20
Valor 3: 30
Ingrese las probabilidades:
Probabilidad 1: 0.2
Probabilidad 2: 0.5
Probabilidad 3: 0.3

Valores de entrada:
Valor 1: 10.00, Probabilidad 1: 0.20
Valor 2: 20.00, Probabilidad 2: 0.50
Valor 3: 30.00, Probabilidad 3: 0.30

Puntos clave a entender:

  • Usamos matrices para almacenar valores y probabilidades.
  • MAX_OUTCOMES define el número máximo de resultados posibles.
  • scanf() se utiliza para leer la entrada del usuario para valores y probabilidades.
  • Imprimimos la entrada para verificar la correcta entrada de datos.

Suma (valor * probabilidad) sobre todos los resultados

En este paso, ampliarás el programa anterior para calcular el valor esperado calculando la suma de cada valor multiplicado por su probabilidad.

Abre el archivo existente y modifica el código:

cd ~/project
nano expected_value.c

Actualiza el código para calcular el valor esperado:

#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("Ingrese el número de resultados (máximo %d): ", MAX_OUTCOMES);
    scanf("%d", &num_outcomes);

    // Ingresar valores
    printf("Ingrese los valores:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valor %d: ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Ingresar probabilidades
    printf("Ingrese las probabilidades:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Probabilidad %d: ", i + 1);
        scanf("%lf", &probabilities[i]);
    }

    // Calcular el valor esperado
    for (int i = 0; i < num_outcomes; i++) {
        expected_value += values[i] * probabilities[i];
    }

    // Imprimir resultados
    printf("\nDetalles del cálculo:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valor %d: %.2f * Probabilidad %d: %.2f = %.2f\n",
               i + 1, values[i], i + 1, probabilities[i],
               values[i] * probabilities[i]);
    }
    printf("\nValor Esperado: %.2f\n", expected_value);

    return 0;
}

Compila y ejecuta el programa actualizado:

gcc expected_value.c -o expected_value
./expected_value

Ejemplo de salida:

Ingrese el número de resultados (máximo 10): 3
Ingrese los valores:
Valor 1: 10
Valor 2: 20
Valor 3: 30
Ingrese las probabilidades:
Probabilidad 1: 0.2
Probabilidad 2: 0.5
Probabilidad 3: 0.3

Detalles del cálculo:
Valor 1: 10.00 * Probabilidad 1: 0.20 = 2.00
Valor 2: 20.00 * Probabilidad 2: 0.50 = 10.00
Valor 3: 30.00 * Probabilidad 3: 0.30 = 9.00

Valor Esperado: 21.00

Puntos clave a entender:

  • Introducimos expected_value para almacenar la suma de valor * probabilidad.
  • El bucle for calcula cada término y acumula el total.
  • Imprimimos los pasos detallados del cálculo para mostrar cómo se calcula el valor esperado.
  • Se muestra la contribución de cada resultado como (valor * probabilidad).

Imprimir el Valor Esperado

En este paso final, mejorarás el programa para proporcionar una salida más detallada y una mejor experiencia de usuario al mostrar el valor esperado.

Abre el archivo existente y realiza las modificaciones finales:

cd ~/project
nano expected_value.c

Actualiza el código con una mejor presentación y comprobación de errores:

#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("Calculadora de Valor Esperado\n");
    printf("==============================\n");

    // Ingreso del número de resultados
    do {
        printf("Ingrese el número de resultados (1-%d): ", MAX_OUTCOMES);
        scanf("%d", &num_outcomes);

        if (num_outcomes < 1 || num_outcomes > MAX_OUTCOMES) {
            printf("Número de resultados inválido. Inténtelo de nuevo.\n");
        }
    } while (num_outcomes < 1 || num_outcomes > MAX_OUTCOMES);

    // Ingreso de valores
    printf("\nIngrese Valores:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valor %d: ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Ingreso de probabilidades con validación
    printf("\nIngrese Probabilidades:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Probabilidad %d: ", i + 1);
        scanf("%lf", &probabilities[i]);
        total_probability += probabilities[i];
    }

    // Validación de la probabilidad total
    if (total_probability < 0.99 || total_probability > 1.01) {
        printf("\nADVERTENCIA: Las probabilidades no suman 1.0 (suma actual: %.2f)\n",
               total_probability);
    }

    // Calcular el valor esperado
    for (int i = 0; i < num_outcomes; i++) {
        expected_value += values[i] * probabilities[i];
    }

    // Imprimir resultados detallados
    printf("\n--- Detalles del Cálculo ---\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Resultado %d: Valor = %.2f, Probabilidad = %.2f\n",
               i + 1, values[i], probabilities[i]);
        printf("  Contribución: %.2f * %.2f = %.2f\n",
               values[i], probabilities[i], values[i] * probabilities[i]);
    }

    // Salida final del valor esperado
    printf("\n=== Valor Esperado ===\n");
    printf("E(X) = %.2f\n", expected_value);

    return 0;
}

Compila y ejecuta el programa final:

gcc expected_value.c -o expected_value
./expected_value

Ejemplo de salida:

Calculadora de Valor Esperado
==============================
Ingrese el número de resultados (1-10): 3

Ingrese Valores:
Valor 1: 10
Valor 2: 20
Valor 3: 30

Ingrese Probabilidades:
Probabilidad 1: 0.2
Probabilidad 2: 0.5
Probabilidad 3: 0.3

--- Detalles del Cálculo ---
Resultado 1: Valor = 10.00, Probabilidad = 0.20
  Contribución: 10.00 * 0.20 = 2.00
Resultado 2: Valor = 20.00, Probabilidad = 0.50
  Contribución: 20.00 * 0.50 = 10.00
Resultado 3: Valor = 30.00, Probabilidad = 0.30
  Contribución: 30.00 * 0.30 = 9.00

=== Valor Esperado ===
E(X) = 21.00

Mejoras clave:

  • Se agregó validación de entrada para el número de resultados.
  • Se verificó la suma total de probabilidades.
  • Se mejoró la presentación de la salida.
  • Se mostraron las contribuciones individuales de cada resultado.
  • Se mostró claramente el valor esperado final.

Resumen

En este laboratorio, aprenderás a leer valores y probabilidades, y luego a calcular el valor esperado de una distribución discreta en C. Primero, crearás un programa que permita a los usuarios introducir múltiples valores y sus probabilidades correspondientes. Luego, aprenderás cómo sumar el producto de cada valor y su probabilidad para calcular el valor esperado. Finalmente, imprimirás el valor esperado calculado.

Los puntos clave cubiertos en este laboratorio incluyen el uso de matrices para almacenar valores y probabilidades, la definición de un número máximo de resultados posibles y la utilización de la función scanf() para leer la entrada del usuario. El programa se asegura de que los valores y probabilidades de entrada se impriman para su verificación antes de pasar al siguiente paso.