mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RAND-Funktion


Autor: Daniel Gerlach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !
Ich benötige ein Rand-Funktion in C.
Dies soll mir die Zahlen von 0 - 255 ausgeben.
Ich verwende den CodeVision AR C-Compiler
Kann mir jemand ne Info über die Programmierung, oder nen WebLink
geben ?

Bin C-Neuling!
Danke schon mal...

Autor: Rooney Bob (rooney)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So wirds in der stdlib.h vom CCS PCWH 3.249 Compiler realisiert.

#define RAND_MAX  255 // The value of which is the maximum value

unsigned int32 _Randseed = 1;

long rand(void)
{
   _Randseed = _Randseed * 1103515245 + 12345;
   return ((unsigned long)(_Randseed >> 16) % RAND_MAX);
}

void srand(unsigned int32 seed)
{
   _Randseed = seed;
}


-----------------------------------
www.poms-engineering.at

Autor: Daniel Gerlach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Danke..gibt es noch weitere konkrete Beispiele oder
Threads? Mfg

** CodeVision AVR C-Compiler **

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man sollte wissen, das derartige PRNGs (Pseudozufallszahlengeneratoren)
nur dann (pseudo-)zufällige Zahlenfolgen liefern, wenn sie beim Start
mit einem zufälligen Wert initialisiert werden. Dafür ist srand da.

Wenn Du also nicht möchtest, dass der obige PRNG nach jedem Neustart
Deines uC die selben Werte liefert, musst Du entweder den letzten Seed
speichern und nach dem Neustart wieder verwenden oder eine Quelle für
Entropie haben, z.B. die Reaktionszeit eines evtl. Benutzers Deines
Systems o.ä.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ganz wichtig:
srand pro Programmlauf nur einmal aufrufen!

Autor: Daniel Gerlach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mmmh...danke für die info..!
Ich dachte ich könnte vielleicht auf die schnelle eine gängige Routine
bekommen. Aber ich werde mich dann doch mit Büchern belesen um ne
konkrete Lösung zu bekommen!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiss nicht was du willst.
Da oben steht doch eine gängige Routine!

Autor: syd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil das SUCHEN und LESEN ja soooo anstrengend ist!!!!!!!!!



int rand (void)
The rand() function computes a sequence of pseudo-random integers in
the range of 0
to RAND_MAX (as defined by the header file <stdlib.h>).
The srand() function sets its argument seed as the seed for a new
sequence of pseudorandom
numbers to be returned by rand(). These sequences are repeatable by
calling
srand() with the same seed value.
If no seed value is provided, the functions are automatically seeded
with a value of 1.
In compliance with the C standard, these functions operate on int
arguments. Since
the underlying algorithm already uses 32-bit calculations, this causes
a loss of precision.
See random() for an alternate set of functions that retains full 32-bit
precision.


tz, tz, tz

Autor: Rooney Bob (rooney)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>mmmh...danke für die info..!
Ich dachte ich könnte vielleicht auf die schnelle eine gängige Routine
bekommen. Aber ich werde mich dann doch mit Büchern belesen um ne
konkrete Lösung zu bekommen!<

Ist sie dir etwa zu einfach? Das ist eine konkrete Lösung. Verwende
diese Routine um den Abspielmodus RANDOM meines MP3 Players zu
realisieren.

Wennst srand jeweils mit dem Ergebnis von rand aufrufst, dann hast
Zufallszahlen bis dir schlecht wird.

Also:
unsigned int32 seed = 1;
srand(seed);

while(1)
{
  seed = rand();
  srand(seed);
}

Noch Fragen? Probiers einfach aus...


-----------------------------------
www.poms-engineering.at

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thomas: Warum seedest Du den Zufallsgenerator nach jedem rand neu? Das
ist (je nach Anwendung) unnötig, kontraproduktiv oder gefährlich.
Der korrekte Ablauf ist: Einmal srand aufrufen (möglichst mit einem
zufälligen Wert), danach beliebig viele Zufallszahlen mit rand abrufen.

Autor: Andreas Bombe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Zufallsgenerator immer neu initialisieren ist sehr schlecht.  Ziehen
wir mal die Implementation heran, die Thomas in der ersten Antwort
gebracht hat:  rand() hat einen 32 Bit Seed und gibt einen Wert von 0
bis 255 zurück.  Wenn man immer den rand() zum neuen Seed macht, hat
der RNG eine höchstmögliche Periode von 256.

Sehr wahrscheinlich weniger, falls er nicht gar bei einem Wert stabil
wird und den endlos ausgibt.  Kein Vergleich mit einem gut
implementierten, nicht durch den Anwender sabotierten RNG.  Der Seed
ist wirklich nur zum Initialisieren da.

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.