2016-04-03 6 views
-1

Wenn Sie Zufallszahlen generieren, rufen Sie zunächst srand(int seed) an, um den Seed zu generieren, und rufen Sie dann rand(void) an.Warum wird Pseudozufallsfunktion nicht direkt als Argument verwendet?

Meine Frage ist, warum nicht direkt eine einzige Funktion als rand(int seed) verwenden.

Der C-Standard hat ein Zitat, das ich nicht verstehe, sagen

Die Umsetzung wird wie verhalten, wenn keine Bibliotheksfunktion die srand-Funktion aufruft.

Ich bin mir nicht sicher, ob es etwas mit dieser Aussage zu tun hat.

Der Standard gibt auch eine Beispielimplementierung, die ich nicht verstehe den Grund einer statischen Variable:

static unsigned long int next = 1; 
int rand(void) // RAND_MAX assumed to be 32767 
{ 
    next = next * 1103515245 + 12345; 
    return (unsigned int)(next/65536) % 32768; 
} 
void srand(unsigned int seed) 
{ 
    next = seed; 
} 
+2

Der Teil über die Bibliothek, der 'srand()' (und 'rand()' selbst nicht aufruft) soll wahrscheinlich die Wiederholbarkeit der von 'rand()' generierten Sequenz sicherstellen. – EOF

+0

Man-Seiten existieren zum Lesen, bevor die Funktionen verwendet werden, die sie beschreiben. Alternativ können Sie ein C-Buch lesen, das beschreibt, wie sie verwendet werden sollen. Sobald Sie gelesen haben, wird es sehr klar sein, warum Ihr Fragevorschlag - nun - eine schlechte Idee ist. – Olaf

Antwort

3

Sie sind nicht srand jedes Mal wenn Sie rand rufen nennen soll. In der Tat, es ist eine sehr schlechte Idee, da der gleiche Samen Ihnen immer die gleiche Sequenz gibt: Sie würden am Ende einen konstanten Wert erzeugen.

srand sollte aufgerufen werden, wenn Sie eine neue Sequenz von Zufallswerten erstellen möchten. Im typischen Fall ist es einmal am Anfang des Programms.

Ab diesem Zeitpunkt gibt jeder Anruf an rand die nächste Nummer in der Sequenz zurück. Deshalb gibt es hier eine statische Variable: so dass rand dort abholen kann, wo es vorher gelandet ist und die nächste Zahl erzeugt.

Verwandte Themen