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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.