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...
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
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.ä.
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!
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
>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
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.