Frage zur rand() Funktion in C
-
Hallo zusammen,
ich habe eine kurze Frage zur rand() Funktion.
Mir ist bekannt, dass man beispielsweise um Zahlen zwischen 1-6 heraus zu bekommen den Modulo Operator verwendet. rand() % 6 + 1;Wenn ich jetzt eine Zahl zwischen A und B haben möchte, sieht das so aus:
int a = 7; int b = 12; srand(time(NULL)); int zuf = rand() % (b - a + 1) + a; printf("%d", zuf);
Jetzt stellt sich mir die Frage, warum genau ist das so ?
Es wäre schön, wenn sich Jemand findet, der das erklären kann.
Vielen Dank für eure Antworten.
-
Weil simple Mathematik.
Fangen wir ganz am Ende an, + a. Das Modulo + 1 wird dir immer einen Wert von 1 bis x zurückgeben. Um an den Anfang des Bereiches, den du haben willst, zu kommen, musst du am Ende noch + a rechnen. Damit hast du schon mal die untere Grenze deines Bereiches bekommen.
Jetzt die obere Grenzen: auf das Ergebnis der Berechnung machen wir in jedem Fall ein + a. Das kann, wenn wir b nicht darauf anpassen, dazu führen, dass wir mit dem + a Werte jenseits von b bekommen. Das wollen wir nicht, deswegen verringern wir b temporär, machen dann die Modulorechnung, und verschieben wieder beide Grenzen.
Es handelt sich dabei praktisch um eine dir bereits bekannte Berechnung mit nachträglicher Grenzenverschiebung. Wenn du also 4 - 9 haben willst, rechnest du auf 1 - 6 runter, machst die Rechnung, und gehst dann wieder auf 4 - 9 hoch.