Frage zu random und randomSeed

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

Sven

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.

Wenn Du mit nur 4 verschiedenen Startwerten arbeitest dann hast Du auch nur 4 verschiedene Pseudozufallsfolgen.

Ein Analoger Eingang streut unbeschaltet nicht auf den ganzen möglichen Bereich sondern wird bestimmte Werte / Bereiche bevorzugen.

Grüße Uwe

Zufallszahlen werden unabhängig von dem in random verwendeten Bereich generiert.

Die Reihenfolge der (interen) Zahlen ist nur abhängig vom Startwert und der Anzahl der Aufrufe.

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.

https://de.wikipedia.org/wiki/Zufallszahlengenerator#Pseudozufallszahlengenerator

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

Sven

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.

Gruß

Gregor

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: http://benedikt.sudo.is/ardrand.pdf 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: https://sites.google.com/site/astudyofentropy/project-definition/timer-jitter-entropy-sources/entropy-library/arduino-random-seed

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: https://github.com/arduino/Arduino/pull/3202

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.

Grüße

Sven

Die Funktion steckt in libc.a. Also eine statisch gelinkte library. So ein Archiv kann man entpacken, aber dann springen auch nur object files heraus

Dein Problem ist aber dass du an gcc festhängst. Das kommt aus der "avr libc". Und wenn man "avr libc random" sucht findest man da auch source code.

Die Berechnungsvorschrift steht in dem PDF von oben drin (S17, 5.2)

The avr-libc PRNG is a Linear congruential generator defined by the recurrence relation
X[n+1} <- (7**5) * X[n] (mod 2**31 - 1)

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.

Grüße und Danke,

Sven