2010-12-08 4 views

Antwort

6

Unter der Annahme einer < B was ist dann dieses ...

srand((unsigned)time(NULL)); 
r = (rand()%(B-A)) + A; 

sich nach den Kommentaren unten, ist es möglich, dass B-A ist in der Tat mehr als RAND_MAX. In diesem Fall müssen Sie vorsichtiger sein.

+0

Kommentieren auf meine eigene Antwort hier, aber um zu klären, Karl K. ist richtig, die srand-funktion muss nur einmal aufgerufen werden. –

+0

Seien Sie vorsichtig, wenn Ihr Intervall 'B - A' größer ist als' RAND_MAX + 1'. In diesem Fall werden die Werte von "r" nicht gleichmäßig verteilt, der maximale Wert von "r" ist "RAND_MAX + A". –

+0

Er sagte A und B sind Ints und ich habe noch nie eine RAND_MAX kleiner als die max int gesehen. Ich nehme an, du hast Recht, aber ich gehe davon aus, dass es sich um einen sehr kritischen Fall handelt. –

3

Sie sollten den Zufallszahlengenerator mit srandnur einmal, und dann erhalten Zufallszahlen mit rand Samen. Die rand Funktion gibt Zahlen von 0 bis zu einer bestimmten Konstante RAND_MAX zurück; Sie sind dafür verantwortlich, die Ergebnisse auf den gewünschten Bereich abzubilden. Der traditionelle Weg, dies zu tun, ist mit dem Modulo-Operator, der den Rest ergibt, der sich aus einer ganzzahligen Division ergibt. Wenn Sie zum Beispiel 7 verschiedene Ergebnisse haben wollen, dann nehmen Sie rand() % 7 und das Ergebnis wird eins sein (0, 1, 2, 3, 4, 5, 6) - die möglichen Reste beim Dividieren durch 7. (Beachten Sie, dass dort sind 7 davon.) Dann fügen Sie einen Offset hinzu, um den gewünschten Bereich von Ergebnissen zu erstellen, wie in Andrew Whites Beispiel.

Der einfachste Weg, um sicherzustellen, dass srand nur einmal aufgerufen wird, ist es am oder nahe dem Anfang von main() zu tun.

Weitere Informationen finden Sie in der Dokumentation dieser Funktionen.

+1

GNU C ist ein Dialekt von C, der eine Anzahl von Erweiterungen bietet, die im Standard nicht vorhanden sind (z. B. die Fähigkeit, eine Funktion im Rahmen einer anderen Funktion zu definieren). – dreamlax

+0

Ich stehe korrigiert. Editiert entsprechend (entfernt dieses Bit). Gibt es irgendwo eine Spezifikation, oder ist das einfach de facto * durch GCC-Compiler-Erweiterungen definiert? –

Verwandte Themen