Zufallszahlen ATMega128

Gast #2578016
Lesenswert?

Hallo,
bevor jetzt jemand meckert weils das Thema schon mal gab, ich hab 
gegoogelt, gesufut und genug threads gefunden, konnte aber mein Problem 
trotzdem nicht lösen.

Ich Programmiere grade (der Schule wegen :D) mit dem ATMega128 (von 
C-Control) und habe eine 7-Segment-Anzeige aus LEDs erstellt die sich 
auf einer Experimentierplatine befindet.
Mit dem Ansteuern der LEDs habe ich keine Probleme, funktioniert alles 
wunderbar.

Jetzt geht es darum, auf der 7-Segment-Anzeige einen Zufallsgenerator 
zum Laufen zu bringen.

Die Funktion rand() liefert mir jedoch immer die gleichen Zahlen.
1
int random(void){
2
    int zfz;
3
    int rest;
4
    
5
    zfz = rand(); //Zufallszahl
6
    rest = zfz % 10; //Zufallszahl 0-9
7
    
8
    return rest;
9
} //END random

Benutze die C-Control Pro IDE (aktuellste Version),
hab mir einige Beispiele aus dem Internet angesehen, wo
mithilfe von time.h gearbeitet, funktioniert aber leider
nicht..

Für Hilfe wäre ich dankbar,
mfg Axel
Gast #2578026
Lesenswert?

Axel42-5 schrieb:
> bevor jetzt jemand meckert weils das Thema schon mal gab, ich hab
> gegoogelt, gesufut und genug threads gefunden, konnte aber mein Problem
> trotzdem nicht lösen.

> Jetzt geht es darum, auf der 7-Segment-Anzeige einen Zufallsgenerator
> zum Laufen zu bringen.

Dann probier es doch mal mit einem PRBS-Generator. Dann brauchst du 
nicht auf irgendwelche undurchsichtigen Bibliotheksfunktionen zu 
vertrauen, sondern kannst selber gucken, was passiert.
Gast #2578162
Lesenswert?

Axel42-5 schrieb:
> Wie ruft man genau srand auf?
> srand(512) <-- so?

Soweit ich mich erinnere, ja. Falls du Linux benutzt, einfach mal "man 
srand" eingeben, da wird alles erklärt.

Wie werden die Zufallszahlen angefordert? Per Tastendruck? Falls ja, 
könntest du messen, wie viele Milli- (oder Mikro-)Sekunden die Taste 
gedrückt wurde und das entsprechend in die Zufallszahlengenerierung 
einfließen lassen.
Gast #2578204
Lesenswert?

@Axel:

Dein Problem ist das Du im AVR selber keine echte Zufallsquelle hast, 
deswegen liefert die Library auch immer die selben Zahlen (weil es 
einfach ein simpler mathematischer Algorithmus ist), und ohne eine echte 
Uhr lohnt es sich auch nicht das mit einem Zeitstempel zu 
initialisieren. Die Variante mit dem Tastendruck ist schon mal eine gute 
Idee, wenn Du irgendwelche Analogwerte hast könntest Du noch das 
unterste Bit jeder Wandlung mit einfliessen lassen. Vielleicht fällt Dir 
noch was anderes ein was nicht vorhersehbar ist und Dein AVR irgendwie 
"messen" kann. Diese Zufalls-Informationen solltest Du sammeln und dann 
für den Zufallsgenerator nutzen. Im Linux-Kernel gibt es dafür eine gute 
Beispielimplementierung, dort werden aus allen möglichen Dingen (wie 
Festplatten-Kopfpositionierung-Zeiten oder eben der Länge von 
Tastendrücken) ein paar Bits an Entropie rausgesaugt und in einem 
Entropiespeicher gesammelt aus dem sich dann bei Bedarf /dev/random 
bedient (solange was drin ist).

http://de.wikipedia.org/wiki//dev/random


Die Idee mit dem EEPROM ist zwar für einfache Dinge tauglich, aber wenn 
der EEPROM gelöscht wurde fängt die Zahlenreihe wieder von vorne an. 
Nebst dessen das mit der Kenntnis über den Wert im EEPROM auch wieder 
der nächste Wert im EEPROM (und alle anderen Zufallszahlen auch) 
vorhersagbar wird und das widerspricht eigentlich dem Prinzip eines 
echten Zufallszahlengenerators.


Eine qualitativ hochwertige Zufallsquelle ist übrigens eine sehr 
schwierige Aufgabenstellung.


Grüße
Erik

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren