Forum: Mikrocontroller und Digitale Elektronik Zufallszahl Atmega16 mit Wertebereich


von Dominik J. (taddus)


Lesenswert?

Hallo erstmal,

ich benötige für ein Programm von mir eine berechnete Zufallszahl. Hab 
bereits gelesen das es natürlich keine echten Zufallszahlen gibt, da die 
CPU schliesslich alles berechnet. Nun benötige ich in meinem Programm 
eine Zufallszahl in dem Bereich von 1-4. Ist dies möglich und dann auch 
mit halbwegs gleicher verteilung?

Ich programmiere den uC in C.

Danke schon mal und Grüße

von KAl (Gast)


Lesenswert?

http://www.rn-wissen.de/index.php/Zufallszahlen_mit_avr-gcc
"Echte" Zufallszahlen zu generieren ist leider nicht möglich, hierzu 
muss man externe Hardware wie einen Rauschgenerator verwenden.

von Dennis X. (Gast)


Lesenswert?

Wenn dir der Pseudo-Zufall der rand-Funktion reicht schreib einfach:

value = (rand()%max_value);

von Mike (Gast)


Lesenswert?

Dominik J. schrieb:
> Nun benötige ich in meinem Programm eine Zufallszahl in dem Bereich
> von 1-4.
Meinst du damit eine aus der Menge der Natürlichen Zahlen {1, 2, 3, 4}?

von Dominik J. (taddus)


Lesenswert?

Jo das reicht mir schon.

Vielen vielen Dank!

Jap meinte ich, aber funktioniert mit der Methode von Dennis 
einwandfrei, soweit ichs bisher getestet hab ;).

: Bearbeitet durch User
von Dennis X. (Gast)


Lesenswert?

Dominik J. schrieb:
> Jap meinte ich, aber funktioniert mit der Methode von Dennis
> einwandfrei, soweit ichs bisher getestet hab ;).

Musst nur schauen ob du von 1-4 brauchst oder eben von 0-4. Evtl. das 
später noch aufaddieren oder eben so lassen.

von Fabian O. (xfr)


Lesenswert?

Das Problem der rand()-Funktion ist, dass Du nach jedem Einschalten 
genau die gleiche "Zufallsfolge" erhälst. Das kann man ändern, indem man 
den Zufallsgenerator einmalig mit srand() und einer echten Zufallszahl 
initialisiert.

Eine echte Zufallszahl zu erhalten, ist aber gar nicht so einfach. Eine 
Möglichkeit wäre, mehrere ADC-Messungen an einem freien Pin 
durchzuführen und das Rauschen in den niederwertigsten Bits zu einer 
Zufallszahl zusammenzusetzen.

Falls Du irgendwelche Eingaben von außen (Tastendrücke, Kommandos von 
serieller Schnittsteller, Sensoren) hast, kannst Du diese Daten auch zum 
Erzeugen von (Initialisierungs-)Zufallszahlen nutzen. Zum Beispiel die 
Zeit zwischen zwei Tastendrücken per Timer stoppen und an srand() 
übergeben.

von Karl H. (kbuchegg)


Lesenswert?

Fabian O. schrieb:

> Eine echte Zufallszahl zu erhalten, ist aber gar nicht so einfach. Eine
> Möglichkeit wäre, mehrere ADC-Messungen an einem freien Pin
> durchzuführen und das Rauschen in den niederwertigsten Bits zu einer
> Zufallszahl zusammenzusetzen.

Kann man natürlich machen.
Man kann sich aber auch ganz einfach den zuletzt benutzten seed im 
EEPROM merken und beim nächsten Einschalten ganz einfach den seed um 1 
erhöhen, damit srand aufrufen um den Generator etwas vorzugeben und den 
neuen seed wieder im EEPROM speichern.

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.