Mal kurz eine Frage zu random. Es handelt sich ja um Pseudorandom-Zahlen, also je nach Startwert ist die nachfolgende Sequenz dann immer gleich. Wenn ich jetzt nacheinander einige random Zahlen benötige, berechnen sich die Nachfolgenden random Zahlen dann immer aufgrund der vorherigen? Sprich, wenn ich die erste Zufallszahl nur von 0 bis 4 sein lasse, habe ich dann auch insgesamt nur 4 verschiedene Abfolgen? Oder habe ich (theoretisch) 1024 verschiedene durch den seed von einem unbelegten Analogeingang. Falls ersteres Zutrifft ist es dann wohl sinnvoller die großen Random Zahlen zuerst zu erstellen.
Grüße
Die Sequenz ist vom Seed abhängig. Jede Sequenz mit dem gleichen Seed ist identisch.
Wenn man einen Taster hat kann man die millis() beim ersten Tastendruck als Seed nehmen. Das macht man einmalig, dann sollte man jedesmal einen anderen Seed haben da man es nicht schafft den Taster ms-genau zu drücken.
Ansonsten gibt es auch bessere RNG Algorithmen auf dem Arduino. Die arbeiten üblicherweise mit Jitter zwischen einem Timer und dem Watchdog Timer, da die unterschiedliche Taktquellen haben. Ein Analog-Eingang streut etwas, aber nicht viel. Kommt auch darauf an für was man die Zufallszahlen braucht.
sven222:
Mal kurz eine Frage zu random. Es handelt sich ja um Pseudorandom-Zahlen, also je nach Startwert ist die nachfolgende Sequenz dann immer gleich. Wenn ich jetzt nacheinander einige random Zahlen benötige, berechnen sich die Nachfolgenden random Zahlen dann immer aufgrund der vorherigen? Sprich, wenn ich die erste Zufallszahl nur von 0 bis 4 sein lasse, habe ich dann auch insgesamt nur 4 verschiedene Abfolgen? Oder habe ich (theoretisch) 1024 verschiedene durch den seed von einem unbelegten Analogeingang.
Die Funktion randomSeed ist in der Arduino-Library wie folgt definiert:
void randomSeed(unsigned int);
D.h. Du kannst die Generierung von Pseudo-Zufallswerten auf den 8-bit Atmegas mit 65536 verschiedenen Startwerten beginnen, und dementsprechend kannst Du mit 65536 verschiedenen Startwerten für randomSeed auch insgesamt 65536 verschiedene Abfolgen von generierten Zufallswerten zwischen 0 und 4 erhalten, je nach per randomSeed() gesetztem Startwert. Bei gleichem Startwert wird dann jeweils nach einem Reset dieselbe Abfolge generiert.
Wenn Du das nicht möchtest, müßtest Du andere Zufallsfunktionen verwenden, oder "echte" Zufallszahlen generieren.
So ganz verstehe ich es noch nicht. Weiß einer von Euch, wo ich den Code für die random Funktion finde? Dann kann ich es mir evtl genauer erklären. Ich verstehe sowas meistens wenn ich mir es mal mit verschiedenen Zahlen durchrechne. Auch nach 30min Github Suche habe ich ihn nicht wirklich gefunden.
Ich habe insgesamt 13 random Funktionen ineinander geschachtelt, und mich täte jetzt mal interessieren wie das sich verhält. Es ist wohl mit einem unbelegten AI als randomSeed ausreichend, da bisher noch niemand eine Regelmäßigkeit entdeckt hat.
Grüße
sven222:
... Weiß einer von Euch, wo ich den Code für die random Funktion finde? Dann kann ich es mir evtl genauer erklären. Ich verstehe sowas meistens wenn ich mir es mal mit verschiedenen Zahlen durchrechne. Auch nach 30min Github Suche habe ich ihn nicht wirklich gefunden.
Wieso suchst Du denn überhaupt auf Github?!
AFAIK wird der avr-gcc benutzt, um den Code zu übersetzen. Den Quellcode vom gcc findest Du vermutlich dort, wo es den gcc gibt.
sven222:
Es ist wohl mit einem unbelegten AI als randomSeed ausreichend, da bisher noch niemand eine Regelmäßigkeit entdeckt hat.
Es kommt wie gesagt darauf an was du machen willst. Wenn du für ein Spiel oder LEDs ein paar Zufallszahlen erzeugen willst ist das eine Sache. Kryptographische Anwendungen sind was ganz anderes.
Hier ist die Streuung eines Analog-Eingangs ab Seite 11:
Alles andere als zufällig
Selbst wenn das gleichmäßig verteilt wäre, hast du mit einem 10 Bit ADC nur 1024 verschiedene Seeds. Da braucht man nicht lange um für eine bekannte Sequenz den Seed-Wert zu berechnen.
Hier ist Code um einen wirklich zufälligen Seed zu berechnen:
Nachtrag:
Was jurs oben zu randomSeed() und int gesagt hat, stimmt nicht mehr. Das wurde inzwischen ausgebessert und ist ist jetzt unsigned long. Die darunterliegende AVR libc Funktion war immer unsigned long:
Das es für Krypthographie nicht reicht ist mir eigentlich klar. Ich brauchte es nur um das Flackern einer Leuchtstoffröhre beim Start mit ein paar LEDs zu simulieren. Und bei einem ATTiny auf einer Lochrasterplatine, wo also nicht jeder freie Platz mit Kupfer auf Ground gelegt ist, streut der Analogeingang ausreichend. Es hat noch niemand, auch ich nicht, Wiederholungen festgestellt.
Ist die random Funktion aus dem gcc? Die müsste doch eher zur Hardware passen, oder? Ich such mal weiter, falls sonst einer weiß wo die Funktion zu finden ist, bitte trotzdem Bescheid sagen.
So, dank Eurer Hilfe habe ich jetzt endlich heraus gefunden was ich wissen wollte. Ich fragte mich, ob er mit dem Ergebnis der Randodm Funktion weiter rechnet, oder ob er den Seed separat weiter führt. Und es wird tatsächlich der Seed weiter geführt. Also auch wenn das Ergebnis der einen Random Funktion zwischen 1 und 4 liegt ist der Seed für die nächste Zahl eine Zahl aus dem long Bereich und nicht das letzte Ergebnis. Was ja Whandall schon zu Beginn schrieb, aber ich erst selbst verstehen wollte warum das so ist.
Das lies mir jetzt keine Ruhe.