C# :: Aufgabe #201
4 Lösungen
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.
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:
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();
}
}
}
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;
}
}class Program
{
static void Main(string[] args)
{
MonteCarloSimulation dieSimulation=new MonteCarloSimulation();
dieSimulation.start(1000000);
Console.WriteLine(dieSimulation.getAusgabeString());
Console.ReadLine();
}
}
/* 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);
}
}
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();
}
}
}
