www.mikrocontroller.net

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


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
also ich habe verschiedene Patterns, die ich "zufällig" ausgeben lassen 
will.
Die Patterns sind wie folgt definiert:
#define OFF 0
#define ON 1
#define SINE 2;
#define SQUARE 3;
#define SAWTOOTH 4;
#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 ?
srand((unsigned int)currenttime.second);
int pattern = rand()%3+2;
Oder hab' ich da was falsch verstanden ?
Danke,
Markus

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Claes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.