Zufallszahlen ATMega128

Gast #2578016
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
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.
#2578056
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.
Gast #2578162
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
@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
Gast #2578653
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.