Forum: Mikrocontroller und Digitale Elektronik RAND-Funktion


von Daniel Gerlach (Gast)


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...

von Rooney B. (rooney)


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

von Daniel Gerlach (Gast)


Lesenswert?

Ok Danke..gibt es noch weitere konkrete Beispiele oder
Threads? Mfg

** CodeVision AVR C-Compiler **

von Christian (Gast)


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.ä.

von Karl heinz B. (kbucheg)


Lesenswert?

Und ganz wichtig:
srand pro Programmlauf nur einmal aufrufen!

von Daniel Gerlach (Gast)


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!

von Karl heinz B. (kbucheg)


Lesenswert?

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

von syd (Gast)


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

von Rooney B. (rooney)


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

von Christian (Gast)


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.

von Andreas Bombe (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.