RAND-Funktion

#394134
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
Gast #394136
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.ä.
Gast #394138
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!
Gast #394140
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
#394141
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
Gast #394142
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.
Gast #394143
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

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.