Verständnisfrage rand() avrlib ...

Gast #426526
Lesenswert?

Hi,
also ich habe verschiedene Patterns, die ich "zufällig" ausgeben lassen 
will.
Die Patterns sind wie folgt definiert:
1
#define OFF 0
2
#define ON 1
3
#define SINE 2;
4
#define SQUARE 3;
5
#define SAWTOOTH 4;
6
#define NOISE 5;
OFF und ON sind keine Patterns ;)
Aber momentan stehe ich mit dem rand Befehl der AVR Lib etwas auf'm 
Schlauch.
Erzeugt mir folgender Aufruf "zufällige"  Zahlen zwischen 2 und 5 ?
1
srand((unsigned int)currenttime.second);
2
int pattern = rand()%3+2;
Oder hab' ich da was falsch verstanden ?
Danke,
Markus
#426535
Lesenswert?

> Oder hab' ich da was falsch verstanden ?

pattern = rand()%4+2

rand() liefert eine Zahl zwischen 0 und RANDMAX.
Durch %4 bringst du sie in den Bereich 0, 1, 2, 3
und dann noch 2 dazu gibt dir den Bereich 2, 3, 4, 5

srand() nur einmal in einem Programm aufrufen!
Da sind Neuling oft übereifrig und rufen das jedesmal
vor einem rand() auf. Dadurch entstehen aber keine
Zufallszahlen mehr. rand ist einfach eine Formel.
Irgendwas in der Richtung

   x_neu = Funktion( x_alt )
   x_alt = x_neu

d.h. bei jedem Aufruf benutzt rand() die vorhergehende
Zufallszahl um die nächste zu generieren. srand() setzt
einfach nur die erste dieser Zahlen.
Moderator Persönliche Seite #427012
Lesenswert?

Markus wrote:

> Das mit dem srand hatte ich nicht gewußt, dann setze ich das einmal
> im Init und gut ist ;)

Nur, damit's nochmal jemand gesagt hat: srand() mit der aktuellen Zeit
zu seeden, ist meist keine gute Idee (insbesondere dann nicht, wenn
die Zeit am Ende gar nur die Zeit seit dem Reset ist und damit
praktisch konstant).  Wenn du wirklichen Zufall brauchst, ist das
Ergebnis zu gut vorhersagbar.  Dann geht nichts über das Einsammeln
,richtigen' Zufalls (Rauschen irgendwo aus der Hardware, Zeitabstand
zwischen Tastendrücken des Benutzers, ...).

Wenn du eh' nur Pseudo-Zufall brauchst, dann musst du den PRNG (*)
auch nicht zwingend mit srand() seeden, eine sauber gleichverteilte
Zufallszahlenfolge liefert er auch so (und zwar immer wieder exakt
dieselbe -- das ist ein Feature).

(*) Pseudo Random Number Generator, kannste im wikipedia nachlesen.

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