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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren