Forum: Compiler & IDEs Verständnisfrage rand() avrlib ...


von Markus (Gast)


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

von Karl heinz B. (kbucheg)


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.

von Claes (Gast)


Lesenswert?

Hallo Markus!

rand()%3 ---> 0, 1, 2
(rand()%3) + 2 ---> 2, 3, 4
dH kein Noise :-)

Also, was mit
rand()%4 ---> 0, 1, 2, 3
(rand()%4) + 2 ---> 2, 3, 4, 5

MfG
Claes in Lund, Schweden

von Markus (Gast)


Lesenswert?

Jaja wieder mal die 0 beim zählen vergessen oops
Das mit dem srand hatte ich nicht gewußt, dann setze ich das einmal im 
Init und gut ist ;)
Danke,
Markus

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

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.