Forum: Mikrocontroller und Digitale Elektronik Zufallszahl beim ATmega8


von Nick P. (pralle_n)


Lesenswert?

Hallo,

ich möchte aktuell für ein Flackerlich eine Zufallszahl auf dem ATmega8 
generieren lassen. "rand();" ergibt immer nur die selbe zahl. Ich habe 
es mit srand(); versucht, doch dort braucht man anscheinen einen 
#include <time.h> für. Ich bekomme allerdings immer den Fehler: time.h: 
No such file or directory.

Was kann ich machen

Danke im Vorraus

Gruß
pralle_n

von Rolf M. (rmagnus)


Lesenswert?

Nick Pralle schrieb:
> Ich habe es mit srand(); versucht, doch dort braucht man anscheinen einen
> #include <time.h> für.

Nein. srand() ist im selben Header wie rand(), nämlich <stdlib.h>.

von Gerald M. (gerald_m17)


Lesenswert?

Hier:
http://rn-wissen.de/wiki/index.php/Zufallszahlen_mit_avr-gcc
Nutze die Funktion getseed und übergebe sie srand. Timer kannst du nur 
bei vorhandener RTC nutzen.

von Nick P. (pralle_n)


Lesenswert?

Moin,

danke erst einmal. Jetzt möchte ich die Zufallszahl einer Variable über 
gebn, aber wenn ich "Wert = srand(unsigned int seed);" schreibe bekomme 
ich immer folgenden fehler:

Error 1 expected expression before 'unsigned' 49 19 Zufall


Wie bekomme ich es sonst hin eine Zufallszahl einer Variable zuzuordnen.

Danke und Gruß
pralle_n

von Sebastian V. (sebi_s)


Lesenswert?

Nick Pralle schrieb:
> wenn ich "Wert = srand(unsigned int seed);" schreibe

Was soll das denn auch sein? So sieht kein Funktionsaufruf in C aus. 
Vielleicht solltest du deine C Kenntnisse nochmal verbessern bevor du 
dich an Mikrocontroller wagst. Bei einem Mikrocontroller ist natürlich 
die Frage woher man überhaupt den Startwert für den 
Zufallszahlengenerator nehmen soll, da es kaum Parameter gibt, die sich 
bei jedem Start unterscheiden. Dazu hat Gerald ja schon eine Funktion 
verlinked, die einen Wert aus dem nicht initialisierten SRAM generiert. 
Damit kannst du dann srand füttern: srand(get_seed()); Danach sollte 
rand() dann unterschiedliche Werte ausgeben

von Ralf G. (ralg)


Lesenswert?

Für'n Flackerlicht wäre mir sowas zufällig genug:
1
uint8_t rnd()
2
{
3
  static uint8_t r;
4
  r = r * 17 + 13;
5
  return r;
6
}

von Karl H. (kbuchegg)


Lesenswert?

Sebastian V. O. schrieb:
> Nick Pralle schrieb:
>> wenn ich "Wert = srand(unsigned int seed);" schreibe
>
> Was soll das denn auch sein?

Was erwartst du?
Das ist halt immer das Problem mit den "Ich brauch kein C Buch, ich les 
mir alles irgendwie aus dem Web zusammen" Leuten. Kennen ihre 
Programmiersprache nur zu 15% und von dem was sie wissen ist dann auch 
noch mindestens die Hälfte falsch.

von Karl H. (kbuchegg)


Lesenswert?

Sebastian V. O. schrieb:

> die Frage woher man überhaupt den Startwert für den
> Zufallszahlengenerator nehmen soll, da es kaum Parameter gibt, die sich
> bei jedem Start unterscheiden.

Eine andere Idee wäre es, ganz einfach bei jedem Start einen um 1 
erhöhten Seed zu nehmen, den man sich aus dem EEPROM holt bzw. um 1 
erhöht wieder im EEPROM abspeichert.

von Falk B. (falk)


Lesenswert?

@ Ralf G. (ralg)

>Für'n Flackerlicht wäre mir sowas zufällig genug:

>uint8_t rnd()
>{
>  static uint8_t r;
>  r = r * 17 + 13;
>  return r;
>}

Denkst du die Leute, welche den C-Compiler bzw. die libc geschrieben 
haben sind doof? Die wissen schon, wie man eine PSEUDO-Zufallsfolge 
erzeugt. Man muss halt wissen, was das PSEUDO bedeutet.

Es wird mit gleichem Startwert IMMER die gleiche, vorhersagbare 
Zahlenfolge ausspucken, auch wenn diese sehr lang ist.

Man braucht, um wenigsten einen halbwegs zufälligen Punkt in der 
Zahlenfolge als Startpunkt festzulegen, eine ansatzweise ECHT zufällige 
Zahl. Diese kann man auf vielen Wegen erzeugen. ADC-Rauschen, Dauer von 
Tastendrücken, Echtzeituhr, Temperatur, Wasserstand von Timbuktu, etc.

von Freddie (Gast)


Lesenswert?

Und wofür brauchst du für ein Flackerlicht einen "halbwegs zufälligen 
Startpunkt"?

Du kannst immer denselben Seed nehmen, das merkt kein Mensch.

von Ralf G. (ralg)


Lesenswert?

Falk Brunner schrieb:
> Denkst du die Leute, welche den C-Compiler bzw. die libc geschrieben
> haben sind doof? Die wissen schon, wie man eine PSEUDO-Zufallsfolge
> erzeugt. Man muss halt wissen, was das PSEUDO bedeutet.

Hmm. Das liest du da raus? :-/

Nick Pralle schrieb:
> ich möchte aktuell für ein Flackerlich eine Zufallszahl auf dem ATmega8
> generieren lassen.

Und wenn's ihm gefällt, will er's kleiner. Ein Tiny13 ist mit 'rand()' 
halb voll!

von Bernd N (Gast)


Lesenswert?

aber nicht Randvoll :-)

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.