Der Zufall und weitere Arrays

In dieser Lektion lernst du mehrdimensionale Arrays kennen. Ausserdem soll mit dem Würfel aus der letzten Lektion auch gewürfelt werden. Dazu braucht es ein Zufallselement. Damit die Ergebnisse aber auch wirklich zufällig sind, müssen einige Dinge beachtet werden. Bei dieser Gelegenheit lernst du auch noch den switch .. case Befehl kennen.


In der Übungsaufgabe kannst du überprüfen, wie zuverlässig der Würfel arbeitet. Eine mögliche Lösung findest du im Lösungsvideo.

Kommentare 10

  • Hallo,


    ich schreib das jetzt mal hier rein, weil es um die Zufallsfunktion des Arduino geht. Ich will Lottozahlen, 1 aus 49, erzeugen. Dabei habe ich festgestellt, dass immer die Zahl '1' kommt, wenn ich den Zufallszahlenbereich random(1,50) verwende. random(1,51) oder random(0,50) liefern hingegen verschieden Zahlen.


    Hier mein Sketch zum testen:


    void setup() {

    Serial.begin(9600);

    }


    void loop() {


    //randomSeed(millis());

    randomSeed(analogRead(A5));


    Serial.print("zufallszahl = ");

    Serial.println(random(0,50));


    delay(300);

    }


    Auf weitere Kommentare habe ich wegen der überschaubaren Komplexität verzichtet.

    A5 ist unbeschaltet. randomSeed(millis()) ergibt auch keine Änderung des Ergebnisses.


    Habe ich da jetzt einen grundlegenden Fehler gemacht? Oder muss ich damit leben?


    Viele Grüße aus dem Ruhrgebiet

    • Hallo swieny,


      wieso das so reagiert, kann ich auch nicht sagen. Allerdings hast du einen kleinen Fehler in Programm.


      randomSeed() muss nur einmal aufgerufen werden und darf daher nicht in loop() stehen. Wenn du es in setup() unterbringst, wird dein Programm schon wesentlich bessere Resultate zeigen.


      Gruss

      René

    • Danke für die Antwort.


      Nein, besser funktioniert es eben nicht. Deshalb habe ich ja den randomseed(millis()) in die Loop genommen, um besser zu sehen, welche Zufallszahl als erste nach einer Initialisierung kommt und das hängt reproduzierbar vom Bereich, der der random-Funktion mitgegeben wird, ab.

      Als Workaround habe ich jetzt eben einen anderen Bereich gesetzt und prüfe ab, ob die Zufallszahl im gewünschte Bereich liegt. Wenn nicht, hole ich eine neue.

      Ich möchte nur gerne verstehen, was bei random "unter der Haube" abläuft.


      viele Grüße

    • Beim Zufallsgenerator handelt es sich um einen Pseudo-Zufallsgenerator, etwas exakter ausgedrückt ein deterministischer Zufallsgenerator. Das heisst, dass er jedesmal dieselbe Zahlenfolge liefert. Er kann aber mit einem Startwert initialisiert werden und so verschiedene Sequenzen erzeugen. Eine Beschreibung findest du bei Wikipedia.


      Dieser Startwert wird mit randomSeed() gesetzt. Der Befehl darf darum niemals in loop() stehen. Es dient einzig und alleine der einmaligen Initialisierung des Zufallsgenerators. Du musst ihn also zwingend in setup() unterbringen.


      random() liefert einfach den nächsten Wert der Sequenz zurück. Dieser ist eigentlich unabhängig von den angegebenen Grenzen. Damit der ausgegebene Wert innerhalb der Grenzen liegt, findet intern eine Umrechnung statt, ähnlich wie es der map() - Befehl macht.


      Gruss

      René

    • Danke vielmals.

      Die erste Zahl bleibt die '1', auch wenn der Seed im Setup gesetzt wird (random(1,50)). Ich finde mich damit ab und verwende random(1,51), damit funktioniert es einwandfrei.

      Vielleicht weil es kein orginal Arduino ist sondern ein Chinanachbau?

      Na egal, danke jedenfalls, auch für das tolle Tutorial.

      viele Grüße.

    • Das wird in der Arduino-Biblothek gemacht. Ich denke, dass hier ein Fehler vorliegt. Der Arduino-Clone ist hier unschuldig, auf meinem Original ist der Fehler ebenfalls vorhanden.


      Du kannst auch in setup() zuerst randomSeed() und dann einmal random() aufrufen. Dann ist die 1 weg und der Rest der Zahlen ist zufällig.


      void setup() {

      ...

      randomSeed(analogRead(A5));

      random(0,50);

      }


      void loop() {

      int x = random(0,50);

      ...

      }

  • Ich komme mit dem randomSeed Befehl noch nicht klar. Wenn ich zum Beispiel analogRead(100) eingebe funktioniert es genauso, obwol es den Eingang gar nicht gibt.

    • Ich weiss nicht genau, wie im Arduino analogRead() implementiert ist. Es könnte durchaus sein, dass aus deinen 100 nur die Bits entnommen werden, die im gültigen Bereich liegen. Es ist aber wesentlich sicherer, wenn du einen gültigen und unbeschalteten Analogeingang wählst.

    • Kein Problem, da weiss ich bescheid und nehms als gegeben hin. Danke!

  • Danke, man lernt nie aus. Neue Kenntnisse gewonnen.

    Mit leichten modifikationen habe ich den Scetch" Würfel 6" mit 7 Led's realisiert. Würfelt von 1 bis 6.