Der Mathematiker Laplace beschäftigte sich im 18. Jahrhundert mit der Wahrscheinlichkeitsrechnung. Der nach ihm benannte Zufallsversuch sagt aus, dass bei einem Zufallsversuch die Wahrscheinlichkeit aller möglichen Ergebnisse gleich sind.
Beispiele:
- Wird eine Münze geworfen, ist die Wahrscheinlichkeit, dass Kopf oder Zahl fällt, genau 1 zu 2 oder 50%. Natürlich ist dies in der Praxis nicht ganz genau. Viele Faktoren wie zum Beispiel der etwas verschobene Schwerpunkt der Münze beeinflussen das Ergebnis. Je häufiger die Münze geworfen wird, desto mehr gleicht sich das Ergebnis an die zu erwartende Wahrscheinlichkeit an.
- Die Wahrscheinlichkeit, dass bei einem Würfel eine bestimmte Augenzahl oben liegt, beträgt 1 zu 6 oder gerundet 16,67%. Das Programm soll durch die Steigerung der Anzahl der Würfe zeigen, dass sich die Wahrscheinlichkeit auf ein Ergebnis (die Augenzahl) immer mehr an die zu erwartende Wahrscheinlichkeit von 16,67% angleicht.
So sieht es aus:
Für diese Anleitung brauchst du nur den Arduino.
Im Kopf des Programms werden die Variablen definiert.
// Start mit 10 Durchläufen
double MaxDurchlauf = 10;
// statistische Wahrscheinlichkeit eine bestimmte Zahl zu würfeln
const double StatistischeWahrscheinlichkeit = 16.67;
String Leerzeichen;
Der setup-Teil startet den Seriellen Monitor, den Zufallsgenerator und gibt einen Hinweis auf das Programm.
void setup()
{
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial) {;}
Serial.println("Laplace-Versuch -> s = Start");
Serial.println("-----------------------------------------");
Serial.println("Die Anzahl der W\u00fcrfe wird jeweils verdoppelt!");
Serial.println("-----------------------------------------");
}
Der loop-Teil. Beachte die Kommentare.
void loop()
{
// alle Variablen 0 setzen
int Durchlauf = 0;
int AnzahlEins = 0;
int AnzahlZwei = 0;
int AnzahlDrei = 0;
int AnzahlVier = 0;
int AnzahlFuenf = 0;
int AnzahlSechs = 0;
// Zahlen von 1 bis 6
int Minimum = 1;
int Maximum = 7;
String AnzahlFormat;
String AbweichungFormat;
double Abweichung;
String Zeichen;
while (Serial.available() > 0)
{
// Eingabe im Seriellen Monitor lesen
char Eingabe = Serial.read();
// Enter/Senden gedrückt
if (Eingabe == 's')
{
Serial.println("Anzahl der W\u00fcrfe: " + String(MaxDurchlauf));
Serial.println("------------------------------------------------------------------");
while (Durchlauf < MaxDurchlauf)
{
int Zahl = ZufallsZahl(Minimum, Maximum);
// Anzahl der Wuerfe speichern
if (Zahl == 1) AnzahlEins ++;
if (Zahl == 2) AnzahlZwei ++;
if (Zahl == 3) AnzahlDrei ++;
if (Zahl == 4) AnzahlVier ++;
if (Zahl == 5) AnzahlFuenf ++;
if (Zahl == 6) AnzahlSechs ++;
Durchlauf ++;
}
// Ergebnis berechnen und formatieren
// 1
/*
Anzahl Leerzeichen ergaenzen
< 10 -> 3 Leerzeichen
> 10 und < 100 -> 2 Leerzeichen
> 100 kein Leerzeichens
> 10.000 nicht möglich, maximale Durchlaeufe = 20.000
*/
Leerzeichen = "";
if (AnzahlEins < 10) Leerzeichen = " ";
if (AnzahlEins < 100 && AnzahlEins > 9) Leerzeichen = " ";
// % berechnen und als String formatieren
AnzahlFormat = String(AnzahlEins / MaxDurchlauf * 100);
// . durch , ersetzen
AnzahlFormat.replace(".", ",");
// wenn %-Wert < 10 -> Leerzeichen ergaenzen
if (AnzahlFormat.length() < 5) AnzahlFormat = " " + AnzahlFormat;
// Abweichung von der zu erwartenden Wahrscheinlichkeit in % berechnen
Abweichung = StatistischeWahrscheinlichkeit - AnzahlEins / MaxDurchlauf * 100;
/*
die Berechnung der Abweichung hat als Ergebnis eine negative Zahl, wenn
das Ergebnis nach oben von 16,67 abweicht und eine positive Zahl, wenn das Ergebnis
unten abweicht
die Abweichung soll so formatiert werden, dass
- die Differenz von einem niedrigen Wert als 16,67 bis 16,67
mit dem Vorzeichen - angezeigt wird
- die die Differenz von einem höheren Wert als 16,67 bis 16,67
mit dem Vorzeichen + angezeigt wird
*/
if (AnzahlEins / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
{
/*
%-Wert < 16.67
Wert für Abweichung soll negativ werden
Vorzeichen - char(43) setzen
*/
Abweichung = Abweichung * - 1;
Zeichen = char(43);
}
// %-Wert > 16,67 -> Vorzeichen + char(45) setzen
else Zeichen = char(45);
// Abweichung in String umwandeln und . durch , ersetzen
AbweichungFormat = String(Abweichung);
AbweichungFormat.replace(".", ",");
// wenn Wert < 10 -> Leerzeichen ergaenzen
if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
// Ergebnis anzeigen mit \t = Tabulator formatieren
Serial.print("Anzahl 1: \t" + Leerzeichen + String(AnzahlEins));
Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
Serial.println(Zeichen + AbweichungFormat + "%");
// 2
Leerzeichen = "";
if (AnzahlZwei < 10) Leerzeichen = " ";
if (AnzahlZwei < 100 && AnzahlZwei > 9) Leerzeichen = " ";
AnzahlFormat = String(AnzahlZwei / MaxDurchlauf * 100);
AnzahlFormat.replace(".", ",");
if (AnzahlFormat.length() < 2) AnzahlFormat = AnzahlFormat + " ";
if (AnzahlFormat.length() < 5) AnzahlFormat = " " + AnzahlFormat;
Abweichung = StatistischeWahrscheinlichkeit - AnzahlZwei / MaxDurchlauf * 100;
if (AnzahlZwei / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
{
Abweichung = Abweichung * - 1;
Zeichen = char(43);
}
else Zeichen = char(45);
AbweichungFormat = String(Abweichung);
AbweichungFormat.replace(".", ",");
if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
Serial.print("Anzahl 2: \t" + Leerzeichen + String(AnzahlZwei));
Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
Serial.println(Zeichen + AbweichungFormat + "%");
// 3
Leerzeichen = "";
if (AnzahlDrei < 10) Leerzeichen = " ";
if (AnzahlDrei < 100 && AnzahlDrei > 9) Leerzeichen = " ";
AnzahlFormat = String(AnzahlDrei / MaxDurchlauf * 100);
AnzahlFormat.replace(".", ",");
Abweichung = StatistischeWahrscheinlichkeit - AnzahlDrei / MaxDurchlauf * 100;
if (AnzahlDrei / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
{
Abweichung = Abweichung * - 1;
Zeichen = char(43);
}
else Zeichen = char(45);
AbweichungFormat = String(Abweichung);
AbweichungFormat.replace(".", ",");
if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
Serial.print("Anzahl 3: \t" + Leerzeichen + String(AnzahlDrei));
Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
Serial.println(Zeichen + AbweichungFormat + "%");
// 4
Leerzeichen = "";
if (AnzahlVier < 10) Leerzeichen = " ";
if (AnzahlVier < 100 && AnzahlVier > 9) Leerzeichen = " ";
AnzahlFormat = String(AnzahlVier / MaxDurchlauf * 100);
AnzahlFormat.replace(".", ",");
if (AnzahlFormat.length() < 5) AnzahlFormat = " " + AnzahlFormat;
Abweichung = StatistischeWahrscheinlichkeit - AnzahlVier / MaxDurchlauf * 100;
if (AnzahlVier / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
{
Abweichung = Abweichung * - 1;
Zeichen = char(43);
}
else Zeichen = char(45);
AbweichungFormat = String(Abweichung);
AbweichungFormat.replace(".", ",");
if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
Serial.print("Anzahl 4: \t" + Leerzeichen + String(AnzahlVier));
Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
Serial.println(Zeichen + AbweichungFormat + "%");
// 5
Leerzeichen = "";
if (AnzahlFuenf < 10) Leerzeichen = " ";
if (AnzahlFuenf < 100 && AnzahlFuenf > 9) Leerzeichen = " ";
AnzahlFormat = String(AnzahlFuenf / MaxDurchlauf * 100);
AnzahlFormat.replace(".", ",");
if (AnzahlFormat.length() < 5) AnzahlFormat = " " + AnzahlFormat;
Abweichung = StatistischeWahrscheinlichkeit - AnzahlFuenf / MaxDurchlauf * 100;
if (AnzahlFuenf / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
{
Abweichung = Abweichung * - 1;
Zeichen = char(43);
}
else Zeichen = char(45);
AbweichungFormat = String(Abweichung);
AbweichungFormat.replace(".", ",");
if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
Serial.print("Anzahl 5: \t" + Leerzeichen + String(AnzahlFuenf));
Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
Serial.println(Zeichen + AbweichungFormat + "%");
// 6
Leerzeichen = "";
if (AnzahlSechs < 10) Leerzeichen = " ";
if (AnzahlSechs < 100 && AnzahlSechs > 9) Leerzeichen = " ";
AnzahlFormat = String(AnzahlSechs / MaxDurchlauf * 100);
AnzahlFormat.replace(".", ",");
if (AnzahlFormat.length() < 5) AnzahlFormat = " " + AnzahlFormat;
Abweichung = StatistischeWahrscheinlichkeit - AnzahlSechs / MaxDurchlauf * 100;
if (AnzahlSechs / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
{
Abweichung = Abweichung * - 1;
Zeichen = char(43);
}
else Zeichen = char(45);
AbweichungFormat = String(Abweichung);
AbweichungFormat.replace(".", ",");
if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
Serial.print("Anzahl 6: \t" + Leerzeichen + String(AnzahlSechs));
Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
Serial.println(Zeichen + AbweichungFormat + "%");
Serial.println("------------------------------------------------------------------");
if (MaxDurchlauf < 20000) MaxDurchlauf = MaxDurchlauf * 2;
else MaxDurchlauf = 10;
}
}
}
Verwandte Anleitungen:
- Einmaleinsreihen anzeigen
- Fußballtipp
- Geldautomat
- Lottozahlen - Anzeige im Seriellen Monitor
- Primzahlen ermitteln
- Satzmaschine
- Schneckenrennen
- Städte-Info
- Taschenrechner Grundrechenarten
- Teiler bestimmen
- Vokale zählen
- Vollkommene Zahlen
- Würfeln Serieller Monitor
Letzte Aktualisierung: