Forum: Mikrocontroller und Digitale Elektronik Zufallszahlen ATMega128


von Axel42-5 (Gast)


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

von Michael (Gast)


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.

von Axel42-5 (Gast)


Lesenswert?

Wär eher nicht so die Lösung.

Das Problem sollte Softwareseitig gelöst werden.

von Klaus W. (mfgkw)


Lesenswert?

Man kann den Startwert aber beeinflussen (srand()).
Eine mögliche Lösung wäre also, immer beim Starten einen Wert aus dem 
EEPROM auszulesen, damit srand() aufzurufen und einen neuen Wert (z.B. 
aus einem rand()-Aufruf) wieder im EEPROM abzulegen.

von Axel42-5 (Gast)


Lesenswert?

Danke,
ist eine gute Idee,
werd mich nachher mal dransetzen.

Wie ruft man genau srand auf?
srand(512) <-- so?

von S Hahn (Gast)


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.

von Erik (Gast)


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

von Florian (Gast)


Lesenswert?

Ein alter Hut. ich denke die SuFu hätte geholfen.
Zufallszahlen erzeugt man durch eine A/D Wandlung eines nicht 
angeschlossenen Pins.

von Michael (Gast)


Lesenswert?

Michael schrieb:
> Dann probier es doch mal mit einem PRBS-Generator.

Axel42-5 schrieb:
> Wär eher nicht so die Lösung.
> Das Problem sollte Softwareseitig gelöst werden.

Und was spricht dagegen, den PRBS-Generator in Software zu 
implementieren?
Mit ein paar Schiebeoperationen und Bitmaskierungen ist das schnell 
umgesetzt.

von Florian G. (stromflo)


Lesenswert?

Guten Abend,

ein Ansatz für einen Zufallsgenerator findest du hier:

http://roboblog.fatal-fury.de/?p=15.

Gruß Flo

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.