Wie Pseudozufallszahl zwischen A zu B (A, B sind int) in GNU C nur mit Standard zu generieren BibliothekWie Pseudozufallszahl zwischen A bis B (A, B sind int) in GNU C nur mit Standardbibliothek
Vielen Dank!
Wie Pseudozufallszahl zwischen A zu B (A, B sind int) in GNU C nur mit Standard zu generieren BibliothekWie Pseudozufallszahl zwischen A bis B (A, B sind int) in GNU C nur mit Standardbibliothek
Vielen Dank!
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.
Kommentieren auf meine eigene Antwort hier, aber um zu klären, Karl K. ist richtig, die srand-funktion muss nur einmal aufgerufen werden. –
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". –
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. –
Sie sollten den Zufallszahlengenerator mit srand
nur 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.
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
Ich stehe korrigiert. Editiert entsprechend (entfernt dieses Bit). Gibt es irgendwo eine Spezifikation, oder ist das einfach de facto * durch GCC-Compiler-Erweiterungen definiert? –
'int rand() {zurück 4;}' –
@Anon: [link] (http://www.xkcd.com/221/) – SLaks