Ich habe in einem kleinen Lampenprojekt einen Zufallszahlen-Generator
verwendet, der Farbwechsel erzeugt. Funktioniert ganz gut, aber nach
längerer Laufzeit scheint er sich festzufahren, die Farbe ändert sich
nicht mehr.
1. Wie kann ich prüfen, ob der Generator zuverlässig durchläuft und
nicht irgendwann immer die gleichen Werte oder Wertefolgen bringt? Ich
habe es für ein paar tausend Testläufe geprüft, aber anscheinend reicht
das nicht.
2. Wie muss ich den Generator modifizieren, um einen zuverlässigen Lauf
zu gewährleisten?
Hier der relevante Programmteil zum Erzeugen der Zufallszahl:
Ein Pseudozufallsgenerator oszilliert immer. Das liegt in der Natur der
Sache. Du willst halt nur, dass die Periode lang genug ist, dass es wie
echter Zufall wirkt. Dazu empfehle ich Wikipedia und andere einschlägige
Seiten, die dir geeignete Formeln (inkl. der nötigen Konstanten)
liefern.
Nu, das hab ich getan, und mit den Konstanten
a = 80
x = 7954
und der Formel
x = a * (x & $FF) + (x >> 8)
erg = (x & $FF)
bekomme ich in einer Simulation auf den PC auch schöne
8-bit-Zufallszahlen, die sich erst nach laaanger Zeit wiederholen.
Allerdings scheint die Umsetzung auf den AVR nur auf den ersten Blick zu
funktionieren, zumindest scheint sich die Funktion festzufahren (also
immer den gleichen Wert zu liefern) oder zu oszillieren (also zwischen 2
Werten zu springen).
Da das erst nach ettlichen tausend Durchläufen passiert, bin ich mit der
Simulation im AVR noch nicht weitergekommen.
Nu versteh doch - das wird dein abr immer tun. Woher sollen denn die
Zufallszahlen kommen wenn dein avr ständig das gleiche macht und damit
ständig das gleiche in dem Refistern steht. Für einen echten
Zufallsgenerator kann man z.b. Das Rauschen einer zdiode nutzen.
http://www.jtxp.org/tech/xr232web.htm
Bupf schrieb:> Woher sollen denn die> Zufallszahlen kommen wenn dein avr ständig das gleiche macht und damit> ständig das gleiche in dem Refistern steht.
Das es Pseudozufallszahlen sind, und dass die Zahlenfolge sich
irgendwann wiederholen wird, ist klar.
Ich brauch auch keine Kryptoqualität, ich brauch nur eine ausreichend
lange Folge, dass sich das Gehirn nicht mehr an die Farbwechsel
erinnert.
Der Generator erzeugt auch nicht alle möglichen Zahlenfolgen, z.B. kann
0x0000 nicht vorkommen.
Die Formel x = a * (x & $FF) + (x >> 8) liefert im PC mit den
angegebenen Startwerten aber zumindest immer wieder einen neuen Wert.
Auf dem AVR scheint sie irgendwann auf einem Wert hängenzubleiben.
moin
einfaches rückgekoppeltes 24 bit schieberegister
random:
rol RAND1 ;Shift the bits ->Carry
rol RAND2 ;RAND are register or Ram
rol RAND3
BRCC rr2
ldi TEMP,0x87
eor RAND1,TEMP
rr2:
ret
Rand 1- 3 im Ram oder Register - mit irgendwas initialisieren aber nicht
"0"
mfg
Achso, die Formel und die Startwerte basieren auf
Beitrag "Re: Zufallszahlen mit Atmega8"
Ich hab den nur auf 8bit abgespeckt und verwende nur den X-Anteil.
Die Unterprogramme rdd_calc und mpy8u scheinen korrekt zu sein, auch
wenn der Zufallszahlengenerator eine Periode von nur 10239 hat.
Timm Thaler schrieb:> zumindest scheint sich die Funktion festzufahren (also immer den gleichen> Wert zu liefern) oder zu oszillieren (also zwischen 2 Werten zu springen).
Dann stimmt wahrscheinlich irgendwo anders im Programm etwas nicht.
Yalu X. schrieb:> eine Periode von nur 10239 hat
Reicht mir... ;-)
Ich hab jetzt eine Kurzversion mal einige tausend Runden laufen lassen,
dabei jeweils 128 Zufallsbytes in den RAM geschrieben (siehe Programm im
Anhang).
Da scheint sich nichts festzulaufen. Dann scheint der Generator erstmal
in Ordnung zu sein.
Wenn ein Durchlauf der Periode keine Probleme macht, dann dürften die
folgenden Durchläufe genauso sein, oder? Schließlich sind es ja jedesmal
dieselben Zahlenfolgen.
@Timm,
also wenn der Zufallsgenerator alleine läuft, dann gibts in dem "nicht
relevanten Programmteil" folgende Fehlermöglichkeiten:
1) deine im RAM liegenen Werte werden durch eine andere Funktion
verändert
1a) Speicherstelle wird gezielt überschrieben
1b) Stacküberlauf
2) im Hauptprogramm und in einer ISR wird ein Register verwendet welches
in der ISR nicht gesichert wird
beides kann erst nach 'sehr' langer Zeit negativ auffallen, wenn der
Fehler nur an einer kleinen Stelle die Auswirkung zeigt
Sascha
MoinMoin,
als kleiner Tip für den Zufall, zumindest hats bei mir mal so geklappt,
setzt aber voraus einige freie Pins zu haben. Die habe ich als Eingang
geschaltet, aber in der Luft hängen und einlesen lassen, und diese Werte
habe ich dann mit denen eines Pseudozufallsgenerators verknüpft.
Das brachte zumindest für mich zufriedenstellende Ergebnisse.
restweihnachtliche Grüße
Chaos