Mittwoch, 26. August 2015

Zufallszahlen mit dem Arduino erzeugen

In diesem Post geht es darum, wie man mit dem Arduino Zufallszahlen erzeugt.


Zufallszahlen mit random()

Die einfachste Möglichkeit, Zufallszahlen zu erzeugen, ist die Funktion random(). Sie benötigt zwei Argumente: die kleinste Zahl, die vorkommen darf, und die erste Zahl, welche zu groß ist. Beispiel:
Wir benötigen eine Zufallszahl zwischen einschließlich 1 und einschließlich 10. Das geht, mit der Funktion random, über den Befehl random(1, 11);.

Das "Problem" von random ist, dass es keine wirklichen Zufallszahlen erzeugt, sondern eine Art Zahlenkette hat. Das bedeutet, dass man beim Neustart des Programms exakt die selben Zufallszahlen erhält. Hier ein kleines Beispiel:
Dieses Programm erzeugt hintereinander fünf Zufallszahlen und schaltet dementsprechend die LEDs, und sendet die Zahlen an den PC. 
Wie man sieht, beginnt die "Zahlenfolge" nach jedem Start von vorne, was bedeutet, dass jedes mal exakt die selben LEDs hintereinander aufleuchten. Um dieses Problem zu beheben gibt es randomSeed().

randomSeed()

Die Funktion randomSeed() gibt dem Mikrocontroller die Anweisung, nicht am Anfang seiner Zahlenfolge zu starten, sondern an dem Punkt, der der Funktion randomSeed(), als Argument, mitgegeben wurde. Wenn man nun immer einen anderen Wert der Funktion randomSeed mitgibt, so erhält man immer andere Zufallszahlen. 

Es gibt verschiedene Möglichkeiten, welche Werte man randomSeed() mitgibt. Eine wäre es den aktuellen Wert eines nicht benutzten analog Pins auszulesen. Eine Andere die aktuellen Millisekunden seit Programmstart, über die Funktion millis(), abzurufen. Hierbei muss man aber darauf achten es nicht im setup Teil zu tun, da sich dort die millis Werte, bei jedem Programmstart, sehr ähnlich sind.

randomSeed(analogRead(1));
randomSeed(millis());

Wenn man nun die Funktion random() aufruft startet sie an dem angegeben Punkt ihrer Zahlenfolge. Beim nächsten Programmstart, startet sie jedoch woanders, wodurch die Zahlen wirklich zufällig sind.

2 Kommentare:

  1. Danke, das war wirklich hilfreich! :D

    AntwortenLöschen
  2. Guten Tag, geiler Beitrag. Kannst du mir evt. noch einmal Helfen? Ich brauche im Loop teil die Befehle, zwischen 6 digital Pins zufällig zu schalten. Wie bekomme ich das hin? Vielen Dank. Jukka Pulz

    AntwortenLöschen

Mit dem Veröffentlichen eines Kommentars erklären Sie sich mit unserer Datenschutzerklärung einverstanden.
https://michaelsarduino.blogspot.de/p/datenschutzerklarung.html