C# :: Aufgabe #201

4 Lösungen Lösungen öffentlich

kleine simulation zweier zufallsereignisse

Anfänger - C# von hollst - 21.03.2018 um 21:25 Uhr
Gegeben seien zwei unabhängige Zufallsereignisse A und B, wobei A mit einer
Wahrscheinlichkeit von 70 % eintritt und B mit eine Wahrescheinlichkeit von 10 %.

Durch (MontoCarlo-) Simulation schätze man ab, mit welchen Wahrscheinlichkeiten das Doppelereignis (A, B)
vorkommt für die Fälle

a) weder A noch B sind eingetreten,
b) entweder A oder B (oder beide) ist (sind) eingetreten.

Man kann das natürlich auch ausrechnen, aber grau ist bekanntlich alle Theorie.

Lösungen:

1 Kommentar
1x
vote_ok
von daniel59 (3770 Punkte) - 23.03.2018 um 07:47 Uhr
Quellcode ausblenden C#-Code
using System;

namespace ConsoleSimulationZweierZufallsereignisse
{
    class Program
    {
        //Vierfeldertafel
        /*
               A    !A
          B  0.07  0.03 0.1
         !B  0.63  0.27 0.9  
             0.7   0.3   1 
        */

        static readonly Random rnd = new Random();
        static void Main(string[] args)
        {
            double ereignisA = 0.7;
            double ereignisB = 0.1;

            int n = 10000000;
            int fallA = 0;//weder A noch B sind eingetreten, => !a && !b = !(a | b)
            //int fallB = 0;//entweder A oder B (oder beide) ist (sind) eingetreten => a | b
            //fallB ist die Gegenwahrscheinlichkeit von fallA
            Console.WriteLine($"Ereignis A tritt mit einer Wahrscheinlichkeit von {ereignisA * 100} % auf.\r\nEreignis B tritt mit einer Wahrscheinlichkeit von {ereignisB * 100} % auf.\r\n");
            Console.WriteLine("Diese Simulation schätzt ab, mit welcher Wahrscheinlichkeit folgende Fälle auftreten:");
            Console.WriteLine("a) weder A noch B sind eingetreten,");
            Console.WriteLine("b) entweder A oder B (oder beide) ist (sind) eingetreten.\r\n");

            for (int i = 0; i < n; i++)
            {
                bool a = rnd.NextDouble() <= ereignisA;
                bool b = rnd.NextDouble() <= ereignisB;

                if (!a && !b)
                {
                    fallA++;
                }
            }

            double pA = fallA / (double)n;
            double pB = 1 - pA;

            Console.WriteLine($"Fall A tritt mit einer Wahrscheinlichkeit von {pA * 100} % auf.");
            Console.WriteLine($"Fall B tritt mit einer Wahrscheinlichkeit von {pB * 100} % auf.");
            Console.ReadLine();
        }
    }
}
vote_ok
von enn (50 Punkte) - 10.04.2018 um 11:06 Uhr
Quellcode ausblenden C#-Code
class MonteCarloSimulation
    {

        private int AnzahlEreignisA = 0;
        private int AnzahlEreignisB = 0;
        private int AnzahlEreignisNichtAOderB = 0;

        private int GesamtDurchlaeufe = 0;

        private Random random;

        public  MonteCarloSimulation()
        {
            random = new Random(DateTime.Now.Millisecond);
        }

        public void start(int AnzahlDurchlaeufe)
        {
            this.GesamtDurchlaeufe = AnzahlDurchlaeufe;
            for (int i=0;i<=AnzahlDurchlaeufe;i++)
            {
                int result = random.Next(100);
                WerteResultAus(result);
            }
        }

        public String getAusgabeString()
        {
            string AusgabeString = "Ergebnis der monte-Carlo Simulation\n";
            AusgabeString += "Ergeinis A : " + getProzentNachSimulation(AnzahlEreignisA).ToString()+"%\n";
            AusgabeString += "Ergeinis B : " + getProzentNachSimulation(AnzahlEreignisB).ToString() + "%\n";
            AusgabeString += "Ergeinis weder A noch B : " + getProzentNachSimulation(AnzahlEreignisNichtAOderB).ToString() + "%\n";

            return AusgabeString;

        }

        private void WerteResultAus(int result)
        {
            if (result < 70)
            {
                AnzahlEreignisA++;
                return;
            }

            if(result<80)
            {
                AnzahlEreignisB++;
                return;
            }

            AnzahlEreignisNichtAOderB++;

        }

        private float getProzentNachSimulation(int Wert)
        {
            return 100 * Wert / GesamtDurchlaeufe;
        }

    }


Quellcode ausblenden C#-Code
class Program
    {
        static void Main(string[] args)
        {
            MonteCarloSimulation dieSimulation=new MonteCarloSimulation();
            dieSimulation.start(1000000);
            Console.WriteLine(dieSimulation.getAusgabeString());
            Console.ReadLine();

        }
    }
2 Kommentare
vote_ok
von art1808 (60 Punkte) - 23.04.2018 um 15:55 Uhr
Quellcode ausblenden C#-Code
/* 23.04.2018
 * Author: art1808
 * 
 * Wahrscheinlichkeit von A = 70%
 * Wahrscheinlichkeit von B = 10%
 * Ausgabe des Ergebnisses
 * 
 */


using System;

namespace kleine_simulation_zweier_zufallsereignisse
{
    class Program
    {
        static void Main()
        {
            Random rnd = new Random();
            Helper help = new Helper();

            do
            {
                int a = rnd.Next(1, 100);
                int b = rnd.Next(1, 100);

                if (a <= 70 && b <= 10)
                    help.Output("A & B"); //a und b
                else if (a <= 70 && b > 10)
                    help.Output("A");//nur a
                else if (b <= 10 && a > 70)
                    help.Output("B");//nur b
                else
                    help.Output("Weder noch");//gar nichts
                Console.ReadLine();
            } while (true);
        }
    }

    class Helper
    {
        public void Output(string x) => Console.WriteLine(x);
    }
}
vote_ok
von hollst (8810 Punkte) - 15.05.2018 um 13:00 Uhr
Quellcode ausblenden C#-Code
using static System.Console;

namespace aufgabe_201
{
    class Program
    {
        static void Main()
        {
            int trails_max = (int)1E+8;

            System.Random rand = new System.Random();
            int counter_Case_a = 0; //weder A noch B sind eingetreten
            int counter_Case_b = 0; //entweder A oder B (oder beide) ist (sind) eingetreten.
            double a = 0.7, b = 0.1;
            for (var i = 0; i < trails_max; i++)            {
                double xa = rand.NextDouble();
                double xb = rand.NextDouble();
                if ((xa >= a) && (xb >= b)) counter_Case_a++;
                if ((xa < a) || (xb < b)) counter_Case_b++;
            }
            WriteLine($"case_a: {((double)counter_Case_a / trails_max).ToString("p")}");
            WriteLine($"case_b: {((double)counter_Case_b / trails_max).ToString("p")} ready");

            ReadKey();
        }
    }
}