Laplace-Ver­such

// Start mit 10 Durchläufen
double MaxDurchlauf = 10;

// statistische Wahrscheinlichkeit eine bestimmte Zahl zu wuerfeln
const double StatistischeWahrscheinlichkeit = 16.67;
String Leerzeichen;

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  Serial.println("Laplace-Versuch");
  Serial.println("s -> Start");
  Serial.println("-----------------------------------------");
  randomSeed(analogRead(A0));
}

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;
    }
  }
}

int ZufallsZahl(int Minimum, int Maximum)
{
  int Zahl =  random(Minimum, Maximum);
  return Zahl;
}

Letzte Aktualisierung: 25. Jul 2023 @ 11:23